【发布时间】:2012-09-13 05:17:51
【问题描述】:
我在 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__ 变量...我不知道...它将是一个变量,它将在第一次运行时接收一个数组(具有未知数量的元素),从那时起,函数将引用其值,但该变量永远不会改变)
现在我只声明一个CudaDeviceVariable 并且我再也不会碰它,但在我的内核上我总是必须发送 DevicePointer,我认为这使得阅读时更难理解......
现在它看起来像这样:
myKernel.Run(staticData.DevicePointer, moreData.DevicePointer,
evenMoreData.DevicePointer, numberOfElementsWhichNeverChange,
moreStaticData.DevicePointer, myResults.DevicePointer)
我想跳过 3 个具有永远不会更改的数据的参数并将其设置在另一个函数中,例如 setData.Run(numElements, staticData, moreStaticData);
并在我的 *.cu 文件中的其他函数中使用常量或设备变量。
【问题讨论】:
-
使用字符串来识别符号(即
cudaMemcpyToSymbol("sym",...))在 CUDA 4.1 中已被弃用,并在 5.0 中被删除,您应该使用实际符号(cudaMemcpyToSymbol(sym,...))。这并不能回答 managedCUDA 问题,仅供参考。
标签: c# cuda constants uninitialized-constant