首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分配常量内存

分配常量内存
EN

Stack Overflow用户
提问于 2010-03-16 05:15:51
回答 3查看 7.5K关注 0票数 6

我试图在常量内存中设置我的模拟参数,但没有成功(CUDA.NET)。cudaMemcpyToSymbol函数返回cudaErrorInvalidSymbol。cudaMemcpyToSymbol中的第一个参数是string...是符号名吗?实际上,我不明白如何解决这个问题。感谢您的帮助。

代码语言:javascript
复制
//init, load .cubin   
float[] arr = new float[1];
    arr[0] = 0.0f;
    int size = Marshal.SizeOf(arr[0]) * arr.Length;
    IntPtr ptr = Marshal.AllocHGlobal(size);
    Marshal.Copy(arr, 0, ptr, arr.Length);
    var error = CUDARuntime.cudaMemcpyToSymbol("param", ptr, 4, 0, cudaMemcpyKind.cudaMemcpyHostToDevice);

我的.cu文件包含

代码语言:javascript
复制
__constant__ float param;

工作解决方案

代码语言:javascript
复制
     cuda.LoadModule(Path.Combine(Environment.CurrentDirectory, "name.cubin"));            
 simParams = cuda.GetModuleGlobal("params");
 float[] parameters = new float[N]{...}             
 cuda.CopyHostToDevice<float>(simParams, parameters);
EN

回答 3

Stack Overflow用户

发布于 2010-03-16 16:00:10

不幸的是,__常量__必须与符号的memcpy在同一文件范围内,在您的例子中,__常量__在一个单独的.cu文件中。

解决这个问题的简单方法是在.cu文件中提供一个包装函数,例如:

代码语言:javascript
复制
__constant__ float param;

// Host function to set the constant
void setParam(float value)
{
  cudaMemcpyToSymbol("param", ptr, 4, 0, cudaMemcpyHostToDevice);
}

// etc.
__global__ void ...
票数 4
EN

Stack Overflow用户

发布于 2011-01-14 14:59:03

如果这个问题是实际的,你可以像这样使用cuModuleGetGlobal和next cudaMemcpy

代码语言:javascript
复制
private bool setValueToSymbol(CUmodule module, string symbol, int value)
{
    CUdeviceptr devPtr = new CUdeviceptr();
    uint lenBytes = 0;
    CUResult result = CUDADriver.cuModuleGetGlobal(ref devPtr, ref lenBytes, module, symbol);
    if (result == CUResult.Success)
    {
        int[] src = new int[] { value };
        cudaError error = CUDARuntime.cudaMemcpy(devPtr, src, lenBytes, cudaMemcpyKind.cudaMemcpyHostToDevice);
        if (error == cudaError.cudaSuccess)
            return true;
        else
            return false;
    }
    else
    {
        return false;
    }
}

其中CUmodule模块= cuda.LoadModule("MyCode.cubin");此代码适用于NVIDIA GPU Computing SDK3.1和CUDA.NET 3.0。

票数 2
EN

Stack Overflow用户

发布于 2010-03-16 09:26:13

常量内存具有隐式局部作用域链接。确保声明位于使用它的同一文件中。听起来你有两个文件。可能还必须将param声明为数组(也可能不是)

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

https://stackoverflow.com/questions/2450556

复制
相关文章

相似问题

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