我需要添加到我的DLL中才能将指针导出到i_d?

时间:2012-04-25 10:56:48

标签: c cuda labview

我正在尝试编写DLL函数来分配cuda内存并返回指向cuda(设备)内存的指针。

第二个函数应接受此指针并进行计算。

我希望这个操作是分开的,因为我需要对相同的数据做很多计算,我试图避免重复将相同的数据复制到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 );

}

我无法从LabVIEW中的i_d函数中获取指向cuda_Malloc的指针。

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

的修改

1 个答案:

答案 0 :(得分: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 ){