为了估计程序在一次内核启动时可以处理多少数据,我尝试使用cudaMemGetInfo()
获取一些内存信息。然而,编译器告诉我这个:
错误:标识符" cudaMemGetInfo"未定义
像cudaGetDeviceProperties();
这样的其他功能可以正常工作。我是否必须安装某个CUDA版本? library description不包含有关版本的信息,等等。
编辑:尽可能小的代码。 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上使用&#34; Cuda编译工具,版本2.0,V0.2.1221&#34; (NVCC)。
当我试图用cudaDriverGetVersion()
安装cuda驱动程序版本时发生了同样的错误(当我使用驱动程序函数cuDriverGetVersion()
时同样的事情)。
系统似乎不会让我知道任何关于它自己的细节......
答案 0 :(得分:7)
对于您使用的旧版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
不同。
答案 1 :(得分:1)
修复此错误:
错误:类型为“unsigned int *”的参数与“size_t *”类型的参数不兼容。
我从nvidia technical report for cuda 3.2发现: 接受或返回内存大小的驱动程序API函数,例如cuMemAlloc()和cuMemGetInfo(),现在使用size_t而不是unsigned int。
因此您必须更改* .cu代码,如下所示:
代码不正确: unsigned int free,total; cuMemGetInfo(&amp; free,&amp; total);
正确的代码: size_t free,total; cuMemGetInfo(&amp; free,&amp; total);