如果调用cudaMalloc,则不会退出简单的控制台程序

Ste*_*ows 6 c++ windows cuda

如果执行cudaMalloc调用,则以下简单程序永不退出.只注释cudaMalloc会导致它正常退出.

#include <iostream>
using std::cout;
using std::cin;

#include "cuda.h"
#include "cutil_inline.h"

void PrintCudaVersion(int version, const char *name)
{
    int versionMaj = version / 1000;
    int versionMin = (version - (versionMaj * 1000)) / 10;
    cout << "CUDA " << name << " version: " << versionMaj << "." << versionMin << "\n";
}

void ReportCudaVersions()
{
    int version = 0;
    cudaDriverGetVersion(&version);
    PrintCudaVersion(version, "Driver");

    cudaRuntimeGetVersion(&version);
    PrintCudaVersion(version, "Runtime");
}

int main(int argc, char **argv)
{
    //CUresult r = cuInit(0);                 << These two lines were in original post
    //cout << "Init result: " << r << "\n";   << but have no effect on the problem

    ReportCudaVersions();

    void *ptr = NULL;
    cudaError_t err = cudaSuccess;
    err = cudaMalloc(&ptr, 1024*1024);
    cout << "cudaMalloc returned: " << err << "  ptr: " << ptr << "\n";
    err = cudaFree(ptr);
    cout << "cudaFree returned: " << err << "\n";

    return(0);
 }
Run Code Online (Sandbox Code Playgroud)

这是在Windows 7,CUDA 4.1驱动程序,CUDA 3.2运行时运行.我跟踪从main到CRT的返回到ExitProcess(),它从不返回(如预期的那样),但是进程永远不会结束.从VS2008我可以停止调试OK.从命令行,我必须杀死控制台窗口.

节目输出:

Init result: 0
CUDA Driver version: 4.1
CUDA Runtime version: 3.2
cudaMalloc returned: 0  ptr: 00210000
cudaFree returned: 0
Run Code Online (Sandbox Code Playgroud)

我尝试使分配量太大,以至于cudaMalloc会失败.它做了并报告了一个错误,但程序仍然不会退出.所以它显然只与调用cudaMalloc有关,而不是分配内存的存在.

关于这里发生了什么的任何想法?

编辑:我在第二句话中错了 - 我必须消除cudaMalloc和cudaFree以使程序退出.离开任何一个导致挂断.

编辑:虽然有许多提到CUDA驱动程序版本向后兼容的事实,但当我将驱动程序恢复到V3.2时,这个问题就消失了.

Vla*_*lad 1

看起来您正在将驱动程序 API ( cuInit) 与运行时 API ( cudaMalloc) 混合在一起。

我不知道幕后是否发生(或应该发生)任何有趣的事情,但您可以尝试的一件事就是删除cuInit并看看会发生什么。