2017-09-13 82 views
0

主持我已经声明使用复制一个静态数组到managedCUDA

myKernel.SetConstantVariable("myStaticArray", new int[]{1,2,3,4,5}); 

在kernel.cu文件的静态数组

__device__ int myStaticArray[5]; 

我可以从主机修改此数组数处理后,我想将这个数组复制到主机,我该怎么做?

EDIT1:我注意到每次运行新内核时,数组都会被重置。我不能使用该数组来保留下一个内核中使用的中间值。是否有可能以静态方式保留这些值?

EDIT2:在EDIT1问题的发生是因为我加载使用LoadKernelPTX多个内核。正确的方法是加载一次模块,然后从该模块构建多个内核。 (如https://github.com/kunzmi/managedCuda/wiki/CudaKernel所建议)这样,我可以在多个内核之间共享静态数组/变量。

回答

1

要么你声明数组为__device__ __constant__ int myStaticArray[5];并将其视为一个常量数组(即你不写它)。然后,您可以使用myKernel.SetConstantVariable(...)从主机初始化值。

或者您保留它作为__device__ int myStaticArray[5];,那么您可以使用构造函数CudaDeviceVariable(CUmodule module, string name)声明CudaDeviceVariable,该构造函数收集指向该静态变量的指针。然后,您可以像往常一样执行“复制到主机”或“复制到设备”。

请注意,如果变量未声明为extern "C",则Cuda中的名称会发生​​损坏,因此您可能必须在PTX文件中查找完整的损坏名称。