【问题标题】:ManagedCuda and __constant__ variablesManagedCuda 和 __constant__ 变量
【发布时间】: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 中我似乎无法做到这一点......我该怎么做??

  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 文件中的其他函数中使用常量或设备变量。

【问题讨论】:

  • 使用字符串来识别符号(即cudaMemcpyToSymbol("sym",...))在 CUDA 4.1 中已被弃用,并在 5.0 中被删除,您应该使用实际符号(cudaMemcpyToSymbol(sym,...))。这并不能回答 managedCUDA 问题,仅供参考。

标签: c# cuda constants uninitialized-constant


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2014-10-14
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    相关资源
    最近更新 更多