私は、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
する必要があります私は私の質問を編集しました。私はcuda_Mallocで送信したのと同じ値を返しています。私はこのDLLをlabviewで使用しています。私はDLLにi_dダミー値 - ゼロとして送信し、cuda_Mallocの終了後にi_dにポインタを含むことを期待していますが、まだゼロです。 – user1281071
kernel_cuda_Mallocでは、i_dはポインタへのポインタです。 cudaMalloc呼び出しでは、 "&"を使用して* this *へのポインタを作成します。 "&"を削除します。あなたは不要なキャストがあるので、そのエラーは隠されています。ただそれを削除します。次の行では、ポインタをcudaMemcpyへのポインタに送信しますが、ポインタは必要です。あなたは "*"と一度参照解除する必要があります。 –