CUDA:标识符“cudaMemGetInfo”未定义
为了估计程序在一次内核启动中可以处理多少数据,我尝试使用 cudaMemGetInfo() 获取一些内存信息。然而,编译器告诉我:
错误:标识符“cudaMemGetInfo”未定义
其他函数如 cudaGetDeviceProperties(); 工作正常。我必须安装特定的 CUDA 版本吗? 库描述不包含信息关于版本等等。
编辑:最小的可能的代码。 cudaSetDevice()
不会生成编译器错误,而 cudaMemGetInfo()
会生成
#include <cuda.h>
#include <cuda_runtime_api.h>
int main(){
unsigned int f, t;
cudaSetDevice(0);
cudaMemGetInfo(&f, &t);
return 0;
}
编辑 2:
我在 Linux 上使用“Cuda 编译工具,版本 2.0,V0.2.1221”(nvcc)。
当我尝试使用 cudaDriverGetVersion()
安装 cuda 驱动程序版本时,发生了相同的错误(当我使用驱动程序函数 cuDriverGetVersion()
时也是如此)。
看来系统不会让我知道任何关于它自己的细节……
To estimate how much data the program may process in one kernel launch i try to get some memory info with cudaMemGetInfo()
. However, the compiler tells me this:
error: identifier "cudaMemGetInfo" is undefined
Other functions like cudaGetDeviceProperties();
work fine. Do I have to install a certain CUDA-version? The library description does not contain infos about the version and so on.
EDIT: the smallest possible code. cudaSetDevice()
generates no compiler error while cudaMemGetInfo()
does
#include <cuda.h>
#include <cuda_runtime_api.h>
int main(){
unsigned int f, t;
cudaSetDevice(0);
cudaMemGetInfo(&f, &t);
return 0;
}
EDIT 2:
I'm on Linux using "Cuda compilation tools, release 2.0, V0.2.1221" (nvcc).
As I tried to get the cuda driver version installed with cudaDriverGetVersion()
the same error occured (same thing when I use the driver function cuDriverGetVersion()
).
It seems that the system wont let me know any detail about itself...
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
对于您使用的非常旧的 CUDA 版本,
cudaMemGetInfo
不是运行时 API 的一部分。它在驱动程序cuMemGetInfo
中有一个对应项,可以使用它来代替。请注意,使用此调用的驱动程序 API 版本需要首先建立上下文。这应该适用于 CUDA 2.x:编辑:此答案适用于 CUDA 3.0 及更高版本:
您的问题不是
cudaMemGetInfo
,而是您提供的参数。我预测这:将在您的示例失败的地方起作用。请注意,
nvcc
使用主机 C++ 编译器来编译主机代码,并且它不会找到参数不正确的 API 函数的实例。请注意, cudaMemGetInfo 的原型是,并且参数应该是
size_t
,这与许多平台上的unsigned int
。For the very old version of CUDA you are using,
cudaMemGetInfo
is not part of the runtime API. It has a counterpart in the drivercuMemGetInfo
, which can be used instead. Note that using the driver API version of this call will require establishing a context first. This should work on CUDA 2.x:EDIT: this answer applied to CUDA 3.0 and later:
Your problem isn't
cudaMemGetInfo
, it is the arguments you are supplying it. I would predict that this:will work where your example fails. Note that
nvcc
uses a host C++ compiler to compile host code, and it will not find instances of API functions with incorrect arguments. Note that the prototype of cudaMemGetInfo isand that the arguments should be
size_t
, which is not the same asunsigned int
on many platforms.修复此错误:
错误:“unsigned int *”类型的参数与“size_t *”类型的参数不兼容。
我从 cuda 3.2 的 nvidia 技术报告那:
接受或返回内存大小的驱动程序 API 函数(例如 cuMemAlloc() 和 cuMemGetInfo())现在使用 size_t 而不是 unsigned int 来实现此目的。
因此您必须更改 *.cu 代码,如下所示:
错误的代码:
unsigned int 空闲,总计;
cuMemGetInfo(&免费,&总计);
正确代码:
size_t 空闲,总计;
cuMemGetInfo(&免费,&总计);
to fix this error:
error: argument of type "unsigned int *" is incompatible with parameter of type "size_t *".
I found from nvidia technical report for cuda 3.2 that:
Driver API functions that accept or return memory sizes, such as cuMemAlloc() and cuMemGetInfo(), now use size_t for this purpose rather than unsigned int.
so you must change *.cu code, as the following lines:
Incorrect code:
unsigned int free, total;
cuMemGetInfo(&free, &total);
Correct code:
size_t free, total;
cuMemGetInfo(&free, &total);