2012-04-25 56 views
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_Malloci_d在LabVIEW中運行。

代碼是https://decibel.ni.com/content/docs/DOC-20353

回答

1

所有CUDA功能從CUDA上下文內執行的修改。爲了能夠在函數之間傳遞指針,還必須保存上下文。

您的代碼沒有多大意義。 DLL中的這兩個函數都稱爲cuda_Malloc。沒有一個函數實際返回任何東西。示例代碼是好的,但只有當你花時間提供你認爲應該的工作。

編輯:對不起,我錯過了您試圖通過修改作爲參數傳入的指針來返回指針的事實。爲了這個工作,你必須傳入一個指向指針的指針,而不僅僅是指針。

int kernel_cuda_Malloc(float *i, void *i_d, int N){ 

應該

int kernel_cuda_Malloc(float *i, void **i_d, int N){ 
+0

我已經編輯我的問題。它仍然返回與我在cuda_Malloc中發送的i_d相同的值。我在labview中使用這個DLL。我發送到DLL作爲i_d虛擬值 - 零,我期待cuda_Malloc完成後i_d將包含指向i_d,但它仍然爲零。 – user1281071 2012-04-26 12:02:34

+1

在kernel_cuda_Malloc中,i_d是指向指針的指針。在cudaMalloc調用中,您使用「&」來指向*那個*。去除 」&」。這個錯誤是隱藏的,因爲你有不必要的演員。只要刪除它。在下一行中,您將指針發送到指向cudaMemcpy的指針,但它只需要一個指針。您需要使用「*」取消引用。 – 2012-04-26 14:04:15

相關問題