2010-03-15 109 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。