2010-03-15 6 views
4

J'essaie de définir mes paramètres de simulation en mémoire constante mais sans chance (CUDA.NET). La fonction cudaMemcpyToSymbol renvoie cudaErrorInvalidSymbol. Le premier paramètre dans cudaMemcpyToSymbol est une chaîne ... Est-ce un nom de symbole? En fait, je ne comprends pas comment cela pourrait être résolu. Toute aide appréciée.Allouer la mémoire constante

//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); 

mon fichier .cu contient

__constant__ float param; 

solution de travail

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

Répondre

1

mémoire CONSTANT liaison portée locale implicite. Assurez-vous que la déclaration est dans le même fichier que vous l'utilisez. on dirait que vous avez deux fichiers. peut également déclarer param à un tableau (ou peut-être pas)

3

Malheureusement, la __ __ constante doit être dans le même champ de fichier que le memcpy au symbole, et dans votre cas votre __ constante __ est dans un document distinct. fichier cu.

La façon simple de contourner cela est de fournir une fonction d'emballage dans votre fichier .cu, par exemple:

__constant__ float param; 

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

// etc. 
__global__ void ... 
+0

L'idée de remerciement est claire et fonctionne pour cpp (--compile). Mais pas en cas de nvcc myfile.cu --cubin dans l'événement post-construction de l'application .net. "(-cubin) Compile tous les fichiers d'entrée .cu/.ptx/.gpu en fichiers .cubin uniquement pour les périphériques Cette étape supprime le code d'hôte pour chaque fichier d'entrée .cu." Donc, quand je charge ce module, il n'inclut pas les fonctions de l'hôte. – Vladimir

1

Si cette question est réelle, vous pouvez utiliser cuModuleGetGlobal et à côté cudaMemcpy comme ceci:

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; 
    } 
} 

où CUmodule module = cuda.LoadModule ("MyCode.cubin"); Ce code fonctionne avec NVIDIA GPU Computing SDK 3.1 et CUDA.NET 3.0.

Questions connexes