我正在尝试编写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
的指针。
答案 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 ){