gpt4 book ai didi

c# - ManagedCuda 和 __constant__ 变量

转载 作者:行者123 更新时间:2023-12-02 22:30:09 24 4
gpt4 key购买 nike

我在 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 中我似乎无法做到这一点...我该怎么做??

  1. 在我的 *.cu 文件中声明常量变量
  2. 将我的 *.cs 文件中的值(数组)设置为该常量
  3. 在同一 *.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 文件中的其他函数中使用常量或设备变量。

最佳答案

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 代码中查找确切的损坏名称。

关于c# - ManagedCuda 和 __constant__ 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12399838/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com