0

cudaメモリを割り当ててcuda(デバイス)メモリへのポインタを取り戻すDLL関数を書き込もうとしています。

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

同じデータに対して多くの計算を行う必要があり、同じデータをGPUメモリに繰り返しコピーしないようにしているため、この操作を分離したいと思います(時間がかかります)-

Q:ポインタをにエクスポートできるようにするには、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 );

}

LabVIEWの関数i_dからポインタを取得できません。cuda_Malloc

コードはhttps://decibel.ni.com/content/docs/DOC-20353の変更です

4

1 に答える 1

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 ){
于 2012-04-25T13:53:11.307 に答える