0

我在 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中所建议)这样,我可以在多个内核之间共享静态数组/变量。

4

1 回答 1

2

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

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

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

于 2017-09-14T14:56:52.447 回答