我正在使用CUDA並嘗試使用函數指針將CUDA函數傳遞到稍後在其設備內核中使用此函數的庫,類似於CUDA函數指針示例。使用庫傳遞CUDA函數指針
代碼的重要部分是:
/** Type definition for the execution function in #qsched_run. */
typedef void (*qsched_funtype)(int , void *);
__device__ void gpuTest(int type , void *data)
{
....
}
__device__ qsched_funtype function = gpuTest;
void main(...)
{
//Various initialization setup.
if(cudaMemcpyFromSymbol(&func , function , sizeof(qsched_funtype)) != cudaSuccess)
error("Failed to copy function pointer from device");
qsched_run_CUDA(&s , func);
}
的qsched_run_CUDA函數是一個庫函數,它一些初始化,複製函數指針裝置(給一個變量它可以看到),然後運行內核在某些時候使用該函數指針調用gpuTest函數。
代碼編譯正確地提供我使用-G具有以下NVCC呼叫:
nvcc -g -G -m64 -I../src ../src/.libs/libquicksched_cuda.a -L/home/aidan/cuda_6.0/lib -L/home/aidan/cuda_6.0/lib64 -lcudart -lcuda -DWITH_CUDA -gencode arch=compute_30,code=sm_30 -lgomp test_gpu_simple.cu -o out.out
其中
../src/.libs/libquicksched_cuda.a
是包含qsched_run_CUDA函數的庫。
的那一刻,我從我的NVCC通話中移除-G標誌後,突然這一切休息,並在qsched_run_CUDA內核運行與無效程序計數器錯誤崩潰,和函數指針(包括我自己。 cu文件)設置爲0x4。
大概我需要使用單獨彙編CUDA(http://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#using-separate-compilation-in-cuda)爲Cuda function pointer consistency隱約解釋 - 但是我不知道如何使用庫函數時,要做到這一點,無論是NVCC的指導,也沒有計算器鏈接使它明顯如何做這個。
有沒有人有這方面的經驗?我試圖簡單地嘗試制定nvlink來做到這一點,但我沒有遠遠(我把它傳遞給圖書館似乎並不高興)。
如果您添加「__noinline__」,會發生什麼情況'__device__ __noinline__ void gpuTest(...'?複製問題的完整代碼將很有用 –
添加__noinline__沒有區別 我將嘗試創建一個小的測試版本(將一個源文件編譯爲庫和一個第二個文件使用該庫進行編譯),然後將其添加到OP,不幸的是,當前的項目太大而無法粘貼到此處 – LonelyCat