我试图在常量内存中设置我的模拟参数,但没有成功(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);发布于 2010-03-16 16:00:10
不幸的是,__常量__必须与符号的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 ...发布于 2011-01-14 14:59:03
如果这个问题是实际的,你可以像这样使用cuModuleGetGlobal和next 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 SDK3.1和CUDA.NET 3.0。
发布于 2010-03-16 09:26:13
常量内存具有隐式局部作用域链接。确保声明位于使用它的同一文件中。听起来你有两个文件。可能还必须将param声明为数组(也可能不是)
https://stackoverflow.com/questions/2450556
复制相似问题