【问题标题】:Whatever Cuda function call returns cudaErrorMemoryAllocation无论 Cuda 函数调用返回 cudaErrorMemoryAllocation
【发布时间】:2014-02-15 05:58:14
【问题描述】:

我想知道为什么我在 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

【问题讨论】:

  • 您能否正确运行 CUDA SDK 示例,尤其是 deviceQuery 示例?
  • 是的,我可以运行 deviceQuery,它会正确打印出我的 8800 GT 的配置。但是,我尝试启动的其他一些示例因“CUDA error code=2 (cudaErrorMemoryAllocation)”而失败
  • 我希望我没有把你引向错误的方向,但我会调查可能的驱动程序问题。您是否为您的卡使用正确的驱动程序?重装驱动怎么样?
  • 我的卡有一个可用的更新,所以我已经安装了它。不幸的是,它并没有解决问题。
  • 您尝试过简单的系统重启吗?它解决了hereherehere这类问题。

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


【解决方案1】:

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

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

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

堆栈跟踪中的 cuD3D11CtxCreate 也创建了一个 CUDA 上下文,所以它可能就是它。

另外:如果您有多个应用程序在竞争您的设备,这也可能是原因。

【讨论】:

  • 我认为 512 MB 应该足以初始化 Cuda 环境,没有其他程序运行会消耗整个内存。
  • 在此之前您是否尝试过重置设备? cudaDeviceReset
  • 我刚才试过了。 cudaDeviceReset() 返回 cudaSuccess,但程序的其余部分没有变化
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-01
    • 2018-12-10
    • 2022-10-15
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多