CUDA:标识符“cudaMemGetInfo”未定义

发布于 2024-12-04 04:01:07 字数 860 浏览 0 评论 0原文

为了估计程序在一次内核启动中可以处理多少数据,我尝试使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

初与友歌 2024-12-11 04:01:07

对于您使用的非常旧的 CUDA 版本,cudaMemGetInfo 不是运行时 API 的一部分。它在驱动程序 cuMemGetInfo 中有一个对应项,可以使用它来代替。请注意,使用此调用的驱动程序 API 版本需要首先建立上下文。这应该适用于 CUDA 2.x:

// CUDA 2.x version
#include <cstdio>
#include <cuda.h>
#include <cuda_runtime_api.h>

int main(){
    unsigned int f, t;
    cudaSetDevice(0);
    cudaFree(0); // This will establish a context on the device
    cuMemGetInfo(&f, &t);
    fprintf(stdout,"%d %d\n",f/1024,t/1024);
    return 0;
}

编辑:此答案适用于 CUDA 3.0 及更高版本:

您的问题不是 cudaMemGetInfo,而是您提供的参数。我预测这:

// CUDA 3.0 or later version
#include <cuda.h>
#include <cuda_runtime_api.h>

int main(){
    size_t f, t;
    cudaSetDevice(0);
    cudaMemGetInfo(&f, &t);
    return 0;
}

将在您的示例失败的地方起作用。请注意,nvcc 使用主机 C++ 编译器来编译主机代码,并且它不会找到参数不正确的 API 函数的实例。请注意, cudaMemGetInfo 的原型是,

cudaError_t cudaMemGetInfo(size_t * free, size_t * total)       

并且参数应该是 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 driver cuMemGetInfo, 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:

// CUDA 2.x version
#include <cstdio>
#include <cuda.h>
#include <cuda_runtime_api.h>

int main(){
    unsigned int f, t;
    cudaSetDevice(0);
    cudaFree(0); // This will establish a context on the device
    cuMemGetInfo(&f, &t);
    fprintf(stdout,"%d %d\n",f/1024,t/1024);
    return 0;
}

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:

// CUDA 3.0 or later version
#include <cuda.h>
#include <cuda_runtime_api.h>

int main(){
    size_t f, t;
    cudaSetDevice(0);
    cudaMemGetInfo(&f, &t);
    return 0;
}

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 is

cudaError_t cudaMemGetInfo(size_t * free, size_t * total)       

and that the arguments should be size_t, which is not the same as unsigned int on many platforms.

断念 2024-12-11 04:01:07

修复此错误:

错误:“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);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文