2011-12-15 18 views
6

次の単純なプログラムは、cudaMalloc呼び出しが実行されても終了しません。 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); 
} 

これは、Windows 7、CUDA 4.1ドライバ、CUDA 3.2ランタイムで動作します。私はメインから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 

私はcudaMallocが失敗することを割り当て量が大きいので作ってみました。それはエラーを報告し、報告しましたが、プログラムはまだ終了しませんでした。だから明らかに単に割り当てられたメモリの存在ではなく、cudaMallocを呼び出すことと関係しています。

ここで何が起こっているかについてのアイデアはありますか?

EDIT:私は2番目の文で間違っていました。プログラムを終了させるには、cudaMallocとcudaFreeの両方を削除する必要があります。どちらか一方を残すとハングアップします。

EDIT:CUDAドライバのバージョンが下位互換性があるという事実には多くの言及がありますが、ドライバをV3.2に戻すとこの問題は解消されました。

+0

私が知る限り、ドライバとランタイムのバージョンを一致させることになっています。 – jmsu

+0

AFAIKでは、ドライバは一般に下位互換性があります。私たちは、かなりうまく動作するより複雑なコードを持っています。 –

+0

だから私は答えとしてそれを置かなかった...私はそれについては分かりません。私は、問題は、cudaMallocが失敗した場合、cudaFreeを使用することはできませんが、どちらか一方を残しておくと、ハングアップが発生するということです。私はどちらかの方法でcudaFreeを削除するか、条件付きで実行します。たぶん、戻りの前にcudaDeviceReset()を試してみませんか? – jmsu

答えて

1

ドライバAPI(cuInit)とランタイムAPI(cudaMalloc)を混在させているようです。

面白いことが起こっているかどうかわかりませんが、あなたが試みることのできる1つのことは、cuInitを削除して何が起こるかを確認することです。

+0

私はそれをコメントアウトしました - 変更はありません。 –

関連する問題