0
我正在嘗試編寫DLL函數來分配cuda內存並獲取指向cuda(設備)內存的指針。我需要添加到我的DLL才能夠將指針導出到i_d?
第二個函數應該接受這個指針並進行計算。
我想這個操作是不同的,因爲我需要做相同的數據很多的計算,我試圖避免相同的數據反覆複製到GPU內存(這需要大量的時間) -
問:我需要添加到我的DLL才能夠將指針導出到i_d
?
我的DLL:
main.cpp中:
extern "C" __declspec(dllexport) int cuda_Malloc (float *i, void **i_d, int N){
for(float x=0; x<N; x++)
i[x]=x;
kernel_cuda_Malloc(i, i_d, N);
return 0;
}
extern "C" __declspec(dllexport) int cuda_Calculation(void *i_d, float *result, int N) {
kernel_cuda_calculation(i_d, result, N);
return 0;
}
simple.cu:
__global__ void kernelTest(float *i, int N){
unsigned int tid = blockIdx.x*blockDim.x + threadIdx.x;
if (tid<N)
i[tid] += 10;
}
int kernel_cuda_Malloc(float *i, void **i_d, int N){
cudaMalloc((void**)&i_d, N*sizeof(float));
cudaMemcpy(i_d, i, N*sizeof(float), cudaMemcpyHostToDevice);
return 0;
}
void kernel_cuda_calculation(float *i_d, float *result, int N){
dim3 threads; threads.x = 240;
dim3 blocks; blocks.x = (N/threads.x) + 1;
kernelTest<<< threads, blocks >>>(i_d, N);
cudaMemcpy(result, i_d, N*sizeof(float), cudaMemcpyDeviceToHost);
cudaFree(i_d);
}
我無法從指針得到cuda_Malloc
出i_d
在LabVIEW中運行。
代碼是https://decibel.ni.com/content/docs/DOC-20353
我已經編輯我的問題。它仍然返回與我在cuda_Malloc中發送的i_d相同的值。我在labview中使用這個DLL。我發送到DLL作爲i_d虛擬值 - 零,我期待cuda_Malloc完成後i_d將包含指向i_d,但它仍然爲零。 – user1281071 2012-04-26 12:02:34
在kernel_cuda_Malloc中,i_d是指向指針的指針。在cudaMalloc調用中,您使用「&」來指向*那個*。去除 」&」。這個錯誤是隱藏的,因爲你有不必要的演員。只要刪除它。在下一行中,您將指針發送到指向cudaMemcpy的指針,但它只需要一個指針。您需要使用「*」取消引用。 – 2012-04-26 14:04:15