2

我在 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__变量......我不知道......它将是一个变量,它将在第一次运行时接收一个数组(具有未知数量的元素),从那时起,该函数将引用它的值,但该变量永远不会改变)

现在我只声明 aCudaDeviceVariable并且我再也不会碰它,但是在我的内核上我总是必须发送 DevicePointer,我认为这使得阅读时更难理解......

现在它看起来像这样:

myKernel.Run(staticData.DevicePointer, moreData.DevicePointer, 
             evenMoreData.DevicePointer, numberOfElementsWhichNeverChange,            
             moreStaticData.DevicePointer, myResults.DevicePointer)

我想跳过具有永远不会更改的数据的 3 个参数,并将其设置在另一个函数中,例如setData.Run(numElements, staticData, moreStaticData);
在我的 *.cu 文件中的其他函数中使用常量或设备变量。

4

1 回答 1

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

于 2012-09-14T15:24:22.000 回答