2010-03-15 5 views
4

상수 메모리에 시뮬레이션 매개 변수를 설정하려고했지만 행운을 빌지 않았습니다 (CUDA.NET). cudaMemcpyToSymbol 함수는 cudaErrorInvalidSymbol을 반환합니다. cudaMemcpyToSymbol의 첫 번째 매개 변수는 string입니다 ... 심볼 이름입니까? 나는 그것이 어떻게 풀릴 수 있는지 이해하지 못한다. 어떤 도움을 주셔서 감사합니다.상수 메모리 할당

//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 파일. 이 질문은이 같은 cuModuleGetGlobal 및 다음 cudaMemcpy를 사용할 수있는 실제의 경우

__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)에서 작동합니다. 하지만 .net app의 post 빌드 이벤트에서 nvcc myfile.cu --cubin의 경우는 아닙니다. "(-cubin) 모든 .cu/.ptx/.gpu 입력 파일을 장치 전용 .cubin 파일로 컴파일합니다.이 단계는 각 .cu 입력 파일의 호스트 코드를 삭제합니다." 그래서이 모듈을로드 할 때 호스트 기능을 포함하지 않습니다. – Vladimir

1

:

이 주변의 간단한 방법은 예를 들어, .CU 파일에 래퍼 함수를 ​​제공하는 것입니다 :

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에서 작동합니다.