分配恒定的记忆

Vla*_*mir 5 cuda cuda.net gpu-constant-memory

我试图将我的模拟参数设置在恒定的内存中,但没有运气(CUDA.NET).cudaMemcpyToSymbol函数返回cudaErrorInvalidSymbol.cudaMemcpyToSymbol中的第一个参数是字符串......它是符号名吗?我不明白它是如何解决的.任何帮助赞赏.

//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);
Run Code Online (Sandbox Code Playgroud)

我的.cu文件包含

__constant__ float param;
Run Code Online (Sandbox Code Playgroud)

工作方案

     cuda.LoadModule(Path.Combine(Environment.CurrentDirectory, "name.cubin"));            
 simParams = cuda.GetModuleGlobal("params");
 float[] parameters = new float[N]{...}             
 cuda.CopyHostToDevice<float>(simParams, parameters);
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 5

不幸的是, __ 常量 __ 必须与符号的 memcpy 位于同一文件范围内,并且在您的情况下,您的 __ 常量 __ 位于单独的 .cu 文件中。

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

__constant__ float param;

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

// etc.
__global__ void ...
Run Code Online (Sandbox Code Playgroud)


Any*_*orn 1

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