分配常量内存
我试图在恒定内存中设置我的模拟参数,但没有运气(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);
I'm trying to set my simulation params in constant memory but without luck (CUDA.NET).
cudaMemcpyToSymbol function returns cudaErrorInvalidSymbol. The first parameter in cudaMemcpyToSymbol is string... Is it symbol name? actualy I don't understand how it could be resolved. Any help appreciated.
//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);
my .cu file contain
__constant__ float param;
Working solution
cuda.LoadModule(Path.Combine(Environment.CurrentDirectory, "name.cubin"));
simParams = cuda.GetModuleGlobal("params");
float[] parameters = new float[N]{...}
cuda.CopyHostToDevice<float>(simParams, parameters);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不幸的是, __ 常量 __ 必须与符号的 memcpy 位于同一文件范围内,并且在您的情况下,您的 __ 常量 __ 位于单独的 .cu 文件中。
解决这个问题的简单方法是在 .cu 文件中提供一个包装函数,例如:
Unfortunately the __ constant __ must be in the same file scope as the memcpy to the symbol, and in your case your __ constant __ is in a separate .cu file.
The simple way around this is to provide a wrapper function in your .cu file, for example:
如果这个问题是真实的,您可以使用 cuModuleGetGlobal 和下一个 cudaMemcpy ,如下所示:
where CUmodule module = cuda.LoadModule("MyCode.cubin");
此代码适用于 NVIDIA GPU 计算 SDK 3.1 和 CUDA.NET 3.0。
If this question is actual you can use cuModuleGetGlobal and next cudaMemcpy like this:
where CUmodule module = cuda.LoadModule("MyCode.cubin");
This code works with NVIDIA GPU Computing SDK 3.1 and CUDA.NET 3.0.
常量内存具有隐式局部作用域链接。
确保声明位于您使用它的同一文件中。听起来你有两个文件。
可能还必须将
param
声明为数组(或者可能不需要)constant memory has implicit local scope linkage.
make sure declaration is in the same file where you use it. it sounds like you have two files.
may also have to declare
param
to array (or maybe not)