2012-04-25 7 views
0

私は、cudaメモリを割り当て、cuda(デバイス)メモリへのポインタを返すDLL関数を書こうとしています。ポインタをi_dにエクスポートするには、DLLに何を追加する必要がありますか?

2番目の関数はこのポインタを受け入れ、計算を行う必要があります。

私は(それは多くの時間を要する)私は、同じデータに多くの計算を行う必要があると私はGPUメモリに同じデータをコピーし、繰り返しを避けるためにしようとしていますので、この操作は別々になりたい -

Q: i_dへのポインタをエクスポートできるようにするには、DLLに何を追加する必要がありますか?

私の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で機能します。

コードCUDAコンテキスト内から実行されるhttps://decibel.ni.com/content/docs/DOC-20353

答えて

1

すべて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で送信したのと同じ値を返しています。私はこのDLLをlabviewで使用しています。私はDLLにi_dダミー値 - ゼロとして送信し、cuda_Mallocの終了後にi_dにポインタを含むことを期待していますが、まだゼロです。 – user1281071

+1

kernel_cuda_Mallocでは、i_dはポインタへのポインタです。 cudaMalloc呼び出しでは、 "&"を使用して* this *へのポインタを作成します。 "&"を削除します。あなたは不要なキャストがあるので、そのエラーは隠されています。ただそれを削除します。次の行では、ポインタをcudaMemcpyへのポインタに送信しますが、ポインタは必要です。あなたは "*"と一度参照解除する必要があります。 –

関連する問題