无论Cuda函数调用返回cudaErrorMemoryAllocation

时间:2014-01-24 09:45:16

标签: cuda out-of-memory runtime-error

我想知道为什么我在Internet上找到的简单Cuda代码示例都没有为我工作,我发现即使这个最简单的代码也会导致错误:

#include <stdio.h>

int main(int argc, char ** argv) {
    size_t available, total;
    cudaError_t err = cudaMemGetInfo(&available, &total);
    if (err == cudaErrorMemoryAllocation) {
        printf("cudaErrorMemoryAllocation");
    } else {
        printf("OK or not memory allocation error");
    }
    return 0;
}

上面的代码总是打印出“cudaErrorMemoryAllocation”。

这是该程序的cuda-memcheck测试的输出:

cudaErrorMemoryAllocation
========= CUDA-MEMCHECK
========= Program hit error 2 on CUDA API call to cudaMemGetInfo 
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:C:\Windows\SYSTEM32\nvcuda.dll (cuD3D11CtxCreate + 0x118a92) [0x137572]
=========     Host Frame:D:\Cuda\a.exe [0x1223]
=========     Host Frame:D:\Cuda\a.exe [0x101c]
=========     Host Frame:D:\Cuda\a.exe [0x901f]
=========     Host Frame:C:\Windows\system32\KERNEL32.DLL (BaseThreadInitThunk + 0x1a) [0x1832]
=========     Host Frame:C:\Windows\SYSTEM32\ntdll.dll (RtlUserThreadStart + 0x21) [0x5d609]
=========
========= ERROR SUMMARY: 1 error

平台 Windows 8 64位

编译器 Visual Studio 2008

计算能力 1.1(GeForce 8800 GT)

CUDA版本 5.5

2 个答案:

答案 0 :(得分:1)

创建CUDA上下文时,会分配a lot of stuff,因此您的可用内存可能不足以初始化它。这可能解释了您收到的 cudaErrorMemoryAllocation 错误。

cudaMemGetInfo 不会抛出该特定错误,因此必须是其他内容:

  

请注意,此函数也可能返回之前的错误代码,   异步启动。

堆栈跟踪中的 cuD3D11CtxCreate 也会创建一个CUDA上下文,因此可能就是这样。

此外:如果您有多个应用正在运行设备竞争,那么这也可能是原因。

答案 1 :(得分:0)

问题解决了。我仍然不确定是什么造成这种情况,要么旧的显卡驱动程序与Cuda安装程序中的“推荐”选项隐藏安装的新显卡之间存在冲突,要么安装了VS 2008。但是我决定重新安装所有内容并尝试VS 2012而不是VS 2008,现在一切正常。