2013-02-14 32 views
1

CUDA內核啓動宏我做了一個宏來簡化CUDA內核調用:使用模板

#define LAUNCH LAUNCH_ASYNC 

#define LAUNCH_ASYNC(kernel_name, gridsize, blocksize, ...) \ 
    LOG("Async kernel launch: " #kernel_name);    \ 
    kernel_name <<< (gridsize), (blocksize) >>> (__VA_ARGS__); 

#define LAUNCH_SYNC(kernel_name, gridsize, blocksize, ...)  \ 
    LOG("Sync kernel launch: " #kernel_name);     \ 
    kernel_name <<< (gridsize), (blocksize) >>> (__VA_ARGS__); \ 
    cudaDeviceSynchronize();         \ 
    // error check, etc... 

用法:

LAUNCH(my_kernel, 32, 32, param1, param2) 

LAUNCH(my_kernel<int>, 32, 32, param1, param2) 

也能正常工作;與第一個定義我可以啓用synronous調用和錯誤檢查調試。

但是它並不能與多個模板參數,像下面的工作:

LAUNCH(my_kernel<int,float>, 32, 32, param1, param3) 

錯誤消息我在該行獲得,我調用宏:

error : expected a ">" 

是否有可能使這個宏工作與多個模板參數?

+0

這是真的發生在你給的情況下,還是隻有當模板有多個參數? – Angew 2013-02-14 12:12:51

+0

是的,它只有多個參數失敗。我要糾正這個問題。 – hthms 2013-02-14 12:27:10

+2

問題是預處理器對角度括號嵌套一無所知,所以它將它們之間的逗號解釋爲宏參數分隔符。 – Angew 2013-02-14 12:32:20

回答

4

問題是預處理器對尖括號嵌套一無所知,所以它將它們之間的逗號解釋爲宏參數分隔符。

如果內核推出語法支持各地內核名稱括號(我現在不能檢查,而不是CUDA的機器上),你可以這樣做:

LAUNCH((my_kernel<int, float>), 32, 32, param1, param3) 
+0

這很好用! – hthms 2013-02-14 12:50:55

1

別的東西,你可以試試我已經使用(根據您發佈的宏)被包裹內核塊大小和網格尺寸參數在自己的宏:

#define KERNEL_ARGS2(grid, block) <<< grid, block >>> 
#define KERNEL_ARGS3(grid, block, sh_mem) <<< grid, block, sh_mem >>> 
#define KERNEL_ARGS4(grid, block, sh_mem, stream) <<< grid, block, sh_mem, stream >>> 

現在,你應該能夠使用您的宏像這樣:

#define CUDA_LAUNCH(kernel_name, gridsize, blocksize, ...) \ 
kernel_name KERNEL_ARGS2(gridsize, blocksize)(__VA_ARGS__); 

你可以用它喜歡:

CUDA_LAUNCH(my_kernel, grid_size, block_size, float* input, float* output, int size); 

這將啓動名爲「my_kernal」與給定的網格和塊大小和輸入參數的內核。