Выделите постоянную память
Я пытаюсь установить параметры симуляции в постоянной памяти, но без удачи (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 ответа
К сожалению, __ константа __ должна находиться в той же области файла, что и 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 ...
Если этот вопрос актуален, вы можете использовать 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.
Постоянная память имеет неявную локальную связь с областью видимости. убедитесь, что объявление находится в том же файле, где вы его используете. Похоже, у вас есть два файла. возможно, также придется объявить param
массивировать (а может и нет)