我在 C# 中使用 ManagedCuda,我有一个问题找不到答案……也许你可以帮助我。我在 C++ 和 CUDA 中读到,您可以声明一个变量(它是一个数组),例如:
__constant__ double myVar[X];
(这应该包含一个 X 元素的数组)
然后稍后使用它从主机代码中设置值:
cudaMemcpyToSymbol(myVar, &arrayFromHost[0], sizeof(arrayFromHost) * numElements,
size_t(0),cudaMemcpyHostToDevice);
所以现在你可以使用类似的东西:
__global__ void myFunction(double *res)
{
*res = myVar[0] + 2.5;
}
使用myVar
从主机设置的值...
但在 ManagedCuda 我似乎无法做到这一点......我该怎么做?
- 在我的 *.cu 文件中声明常量变量
- 将我的 *.cs 文件中的值(一个数组)设置为该常量
- 在同一个 *.cu 文件内的函数中使用常量 1. 中的值
(或__device__
变量......我不知道......它将是一个变量,它将在第一次运行时接收一个数组(具有未知数量的元素),从那时起,该函数将引用它的值,但该变量永远不会改变)
现在我只声明 aCudaDeviceVariable
并且我再也不会碰它,但是在我的内核上我总是必须发送 DevicePointer,我认为这使得阅读时更难理解......
现在它看起来像这样:
myKernel.Run(staticData.DevicePointer, moreData.DevicePointer,
evenMoreData.DevicePointer, numberOfElementsWhichNeverChange,
moreStaticData.DevicePointer, myResults.DevicePointer)
我想跳过具有永远不会更改的数据的 3 个参数,并将其设置在另一个函数中,例如setData.Run(numElements, staticData, moreStaticData);
在我的 *.cu 文件中的其他函数中使用常量或设备变量。