2010-03-15 156 views
4

我想在常量内存中设置我的模拟参数,但没有运气(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); 

我.CU文件包含

__constant__ float param; 

工作液

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

回答

1

常量内存有隐含的局部范围联动。 确保声明位于您使用它的相同文件中。这听起来像你有两个文件。 也可能需要声明param到阵列(或也许不是)

3

不幸的是,__恒定__必须在同一个文件范围的的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 ... 
+0

谢谢你的想法很清楚,适用于cpp(--compile)。但是,如果nvcc myfile.cu --cubin在.net应用程序的后期构建事件中。 “(-cubin)将所有.cu/.ptx/.gpu输入文件编译为仅限设备的.cubin文件。这一步放弃每个.cu输入文件的主机代码。”所以当我加载这个模块时,它不包含主机功能。 – Vladimir 2010-03-16 19:57:45

1

如果这个问题是实际可以使用cuModuleGetGlobal和未来cudaMemcpy是这样的:

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 module = cuda.LoadModule(“MyCode.cubin”); 此代码适用于NVIDIA GPU Computing SDK 3.1和CUDA.NET 3.0。