首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ManagedCuda和__constant__变量

ManagedCuda和__constant__变量
EN

Stack Overflow用户
提问于 2012-09-13 05:17:51
回答 1查看 1.1K关注 0票数 2

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

__constant__ double myVar[X]; (这是用来保存X元素数组的)

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

代码语言:javascript
复制
cudaMemcpyToSymbol(myVar, &arrayFromHost[0], sizeof(arrayFromHost) * numElements, 
                   size_t(0),cudaMemcpyHostToDevice);

因此,现在您可以使用以下内容:

代码语言:javascript
复制
__global__ void myFunction(double *res)
{
    *res = myVar[0] + 2.5;
}

使用主机在myVar中设置的值.

但在ManagedCuda,我似乎做不到.我该怎么做??

  1. 在我的*.cu文件中声明常量变量
  2. 将*.cs文件中的值(数组)设置为该常量
  3. 在同一个*.cu文件中的函数中使用常量1中的值

(或__device__变量.我不知道。它将是一个变量,它将在第一次运行数组时接收数组(具有未知数目的元素),从那时起,函数将引用其值,但该变量不会更改)

现在我只声明一个CudaDeviceVariable,我再也不碰它了,但是在我的内核上我总是要发送DevicePointer,我认为这使得阅读时很难理解.

现在看起来是这样的:

代码语言:javascript
复制
myKernel.Run(staticData.DevicePointer, moreData.DevicePointer, 
             evenMoreData.DevicePointer, numberOfElementsWhichNeverChange,            
             moreStaticData.DevicePointer, myResults.DevicePointer)

我想跳过数据永不更改的3个参数,并将其设置在另一个函数中,如setData.Run(numElements, staticData, moreStaticData);

并在我的*.cu文件中的其他函数中使用常量或设备变量。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-14 15:24:22

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

代码语言:javascript
复制
extern "C" 
{
    __constant__ double myConstVarInCuda[5];
    __global__ void myFunction(double *res) 
    { 
        *res = myConstVarInCuda[0] + 2.5; 
    } 
}

在C#中:

代码语言:javascript
复制
 double[] myVarInCS = new double[] { 1.0, 2.0, 3.0, 4.0, 5.0 };    
    myKernel.SetConstantVariable("myConstVarInCuda", myVarInCS);
    myKernel.Run(...);

如果您没有在外部的"C“作用域中声明您的Cuda代码,请注意名称会受到损坏。在这种情况下,您可以在PTX代码中查找确切的损坏名称。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12399838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档