2015-05-20 6 views
0

Я пытаюсь прояснить некоторые структуры и синтаксис в OpenCL. В настоящее время я работаю с VS2013 и OpenCL Emulator-Debugger. Я начал работать с демо-проект, который поставляется вместе с эмулятором и застрял в этом:Синтаксис определения ядра OpenCL

__Kernel(hello) 
__ArgNULL 
    { 
    ... 
    } 

всего две строки выше есть это:

//__kernel void 
//hello() 

В чем разница между ними? Насколько я понимаю из документации (здесь: http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2012/10/OpenCL-Emu-Documentation-2.pdf

и здесь: https://www.khronos.org/registry/cl/specs/opencl-1.x-latest.pdf) первый - это просто определение макроса в среде OCL-Emu для второго, но нет четкого и однозначного ответа , Это правильно?

+0

Ядро - это просто нормальная функция C (соответствующая ряду ограничений) с атрибутом '__kernel'. –

+0

@ SK-logic Да, я знаю это. Я не могу прояснить, что является правильным синтаксисом для определения одного и в чем разница между приведенными выше синтаксисами. – Arkoudinos

+0

Существует только один синтаксис - атрибут '__kernel'. Ваш код выше, по-видимому, какой-то странный макрос, сначала откройте макросы, чтобы посмотреть, что он на самом деле делает. –

ответ

0

Да, это правильно, первый - это макрос.

__Kernel() - это макрос, а __kernel - это специальный флаг CL, объявляющий функцию C99 как функцию ввода кода GPU (функция ядра).

Так что __Kernel(hello) расширяется до __kernel hello И __ArgNULL расширяется до (). Предоставление вам нормального кода CL: __kernel hello() { ... }

В этом случае Emu-CL, вероятно, необходимы макросы, поскольку он не внутренне расширяется до кода CL. Макросы - это способ упростить и адаптировать язык к CL-подобным выражениям.

Смежные вопросы