Выделите постоянную память - PullRequest
5 голосов
/ 16 марта 2010

Я пытаюсь установить параметры симуляции в постоянной памяти, но безуспешно (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);

Ответы [ 3 ]

4 голосов
/ 16 марта 2010

К сожалению, __ константа __ должна находиться в той же области файла, что и 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 ...
1 голос
/ 14 января 2011

Если этот вопрос актуален, вы можете использовать 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 = cuda.LoadModule ("MyCode.cubin"); Этот код работает с NVIDIA GPU Computing SDK 3.1 и CUDA.NET 3.0.

1 голос
/ 16 марта 2010
Постоянная память

имеет неявную локальную связь области. убедитесь, что объявление находится в том же файле, где вы его используете. Похоже, у вас есть два файла. может также потребоваться объявить param в массив (или, возможно, нет)

...