我在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中所述)这样,我可以跨多个内核共享静态数组/变量。
答案 0 :(得分:2)
要么将数组声明为__device__ __constant__ int myStaticArray[5];
并将其视为常量数组(即您不要写入它)。然后,您可以使用myKernel.SetConstantVariable(...)
初始化主机中的值。
或者您将其保留为__device__ int myStaticArray[5];
,然后您可以使用构造函数CudaDeviceVariable
声明CudaDeviceVariable(CUmodule module, string name)
,该构造函数会收集指向该静态变量的指针。然后,您可以照常执行任何复制到主机或复制到设备。
请注意,如果变量未声明为extern "C"
,则Cuda中的名称会受到损坏,因此您可能需要在PTX文件中查找完整的受损名称。