ManagedCuda和__constant__变量

fig*_*gus 2 c# cuda constants uninitialized-constant

我在C#中使用ManagedCuda,我有一个问题,我无法找到答案......也许你可以帮助我.我在C++和CUDA中读到你可以声明一个变量(这是一个数组),如:

__constant__ double myVar[X]; (这是为了容纳一个X元素数组)

然后使用它来设置主机代码的值:

cudaMemcpyToSymbol(myVar, &arrayFromHost[0], sizeof(arrayFromHost) * numElements, 
                   size_t(0),cudaMemcpyHostToDevice);
Run Code Online (Sandbox Code Playgroud)

所以现在你可以使用类似的东西:

__global__ void myFunction(double *res)
{
    *res = myVar[0] + 2.5;
}
Run Code Online (Sandbox Code Playgroud)

使用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)
Run Code Online (Sandbox Code Playgroud)

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

kun*_*zmi 5

myKernel有一个方法SetConstantVariable()正在做你想做的事情.只需在启动内核之前调用它:在*.cu文件中:

extern "C" 
{
    __constant__ double myConstVarInCuda[5];
    __global__ void myFunction(double *res) 
    { 
        *res = myConstVarInCuda[0] + 2.5; 
    } 
}
Run Code Online (Sandbox Code Playgroud)

在C#中:

 double[] myVarInCS = new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 };    
    myKernel.SetConstantVariable("myConstVarInCuda", myVarInCS);
    myKernel.Run(...);
Run Code Online (Sandbox Code Playgroud)

如果您未在外部"C"范围内声明您的Cuda代码,请注意名称会被破坏.在这种情况下,您可以在PTX代码中查找确切的受损名称.