2015-05-20 112 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邏輯是的,我知道這一點。我無法弄清楚哪一個是定義一個語法的正確語法,以及我提到的上述語法之間有什麼區別。 – Arkoudinos

+0

只有一個語法 - '__kernel'屬性。上面的代碼顯然是一些奇怪的宏,首先擴展宏以查看它實際上在做什麼。 –

回答

0

是的,它是正確的,第一個是宏。

__Kernel()是一個宏,而__kernel是一個特殊的CL標誌,用於聲明C99函數作爲GPU代碼輸入函數(內核函數)。

所以這__Kernel(hello)擴展到__kernel hello__ArgNULL擴展到()。 給你一個正常的CL代碼:__kernel hello() { ... }

在這個Emu-CL的情況下,可能需要宏,因爲它沒有內部擴展到CL代碼。這些宏是一種簡化和適應CL語言表達的方式。