将静态数组复制到managedCUDA

时间:2017-09-13 02:53:34

标签: c# managed-cuda

我在kernel.cu文件中声明了一个静态数组

__device__ int myStaticArray[5];

我可以使用

从主机修改此数组
myKernel.SetConstantVariable("myStaticArray", new int[]{1,2,3,4,5});

经过几次处理后,我想将此数组复制到主机,我该怎么办?

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

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

1 个答案:

答案 0 :(得分:2)

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

或者您将其保留为__device__ int myStaticArray[5];,然后您可以使用构造函数CudaDeviceVariable声明CudaDeviceVariable(CUmodule module, string name),该构造函数会收集指向该静态变量的指针。然后,您可以照常执行任何复制到主机或复制到设备。

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