我正在開發一個通用流式CUDA內核執行框架,允許在GPU上執行並行數據複製&。是否存在某種與Boost :: thread()和Nvidia CUDA的不兼容?
目前我正在調用C++靜態函數封裝內的CUDA內核,所以我可以調用從.cpp文件中的內核(不.CU),像這樣:
//kernels.cu:
//kernel definition
__global__ void kernelCall_kernel( dataRow* in, dataRow* out, void* additionalData){
//Do something
};
//kernel handler, so I can compile this .cu and link it with the main project and call it within a .cpp file
extern "C" void kernelCall(dataRow* in, dataRow* out, void* additionalData){
int blocksize = 256;
dim3 dimBlock(blocksize);
dim3 dimGrid(ceil(tableSize/(float)blocksize));
kernelCall_kernel<<<dimGrid,dimBlock>>>(in, out, additionalData);
}
如果我叫處理程序作爲一個正常的函數,打印的數據是正確的。
//streamProcessing.cpp
//allocations and definitions of data omitted
//copy data to GPU
cudaMemcpy(data_d,data_h,tableSize,cudaMemcpyHostToDevice);
//call:
kernelCall(data_d,result_d,null);
//copy data back
cudaMemcpy(result_h,result_d,resultSize,cudaMemcpyDeviceToHost);
//show result:
printTable(result_h,resultSize);// this just iterate and shows the data
而是讓數據的並行副本並執行在GPU上,我需要創建一個線程,所以當我把它做一個新的boost ::線程:
//allocations, definitions of data,copy data to GPU omitted
//call:
boost::thread* kernelThreadOwner = new boost::thread(kernelCall, data_d,result_d,null);
kernelThreadOwner->join();
//Copy data back and print ommited
我只是得到垃圾當結果打印結果時。
目前我只是使用一個線程,用於測試目的,因此直接調用它或創建一個線程應該沒有太大區別。我不知道爲什麼直接調用函數給出正確的結果,以及創建線程時沒有。這是CUDA &提升的問題嗎?我錯過了什麼嗎?謝謝你的建議。
謝謝,我會嘗試重新設計 – Vik 2011-05-24 08:53:21
是的,那真的很有用,再次感謝你。我永遠無法通過我自己的方式找出它:) – Vik 2011-05-24 12:37:37
爲什麼你需要多線程才能讓內核執行和cudaMemcpy重疊?這就是cudaMemcpyAsync的用途,對吧? – harrism 2011-05-25 03:14:38