我在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中我似乎无法做到这一点......我怎么能这样做?
(或__device__
变量......我不知道......它将是一个变量,它将在第一次运行时接收一个数组(具有未知数量的元素),并且然后,该函数将引用其值,但该变量永远不会改变)
现在我只声明一个CudaDeviceVariable
并且我再也不会触摸它,但是在我的内核上我总是要发送DevicePointer,我认为这会让你在阅读时更难理解...... / p>
现在它看起来像这样:
myKernel.Run(staticData.DevicePointer, moreData.DevicePointer,
evenMoreData.DevicePointer, numberOfElementsWhichNeverChange,
moreStaticData.DevicePointer, myResults.DevicePointer)
我想跳过具有永不改变的数据的3个参数,并将其设置在setData.Run(numElements, staticData, moreStaticData);
之类的另一个函数中
并在我的* .cu文件的其他函数中使用常量或设备变量。
答案 0 :(得分:5)
myKernel有一个方法SetConstantVariable()正在执行您想要做的事情。只需在启动内核之前调用它: 在* .cu文件中:
extern "C"
{
__constant__ double myConstVarInCuda[5];
__global__ void myFunction(double *res)
{
*res = myConstVarInCuda[0] + 2.5;
}
}
在C#中:
double[] myVarInCS = new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 };
myKernel.SetConstantVariable("myConstVarInCuda", myVarInCS);
myKernel.Run(...);
如果您未在外部“C”范围内声明Cuda代码,请注意名称会被破坏。在这种情况下,您可以在PTX代码中查找确切的受损名称。