2011-06-29 11 views
3

私は新しいCUDAアプリケーションを作成し始めました。しかし、私は途中で面白い迂回路を打った。 変数xに最初のcudaMallocを呼び出すと、初めて失敗します。しかし、私はそれを2度目に呼び出すと、cudaSuccessを返します。最近、CUDA 4.0 SDKにアップグレードしましたが、これは本当に奇妙なバグです。CUDA cudaMalloc

私もいくつかのテストを行い、cudaMallocの最初の呼び出しが失敗したようです。あなたがいない場合

+0

メモ:メモリアラインメントの問題に関する私の最初の推測だった割り当てているメモリの量は重要ではありません。 – Nocturnal

+2

cudaGetLastErrorは、以前の非同期呼び出しのエラーを返す可能性があります。 –

+0

小さな例を含めることができますか? –

答えて

4

いずれかのcudaライブラリ関数の最初の呼び出しは、初期化サブルーチンを起動します。何らかの形で初期化が失敗し、cudaMalloc自体が失敗する可能性があります。 (CUDAプログラミングガイド、3.2.1節)

どういうわけか、最初の失敗にもかかわらず、それはうまくいくようです。私はあなたの設定とあなたのコードを知らないので、本当にあなたをさらに助けることはできません。プログラミングガイドを確認してください!

2

私はは強くマクロCUDA_SAFE_CALLを使用してをお勧めします - あなたは、コードのデバッグしている少なくとも一方で、スレッド同期を強制する:1として:

CUDA_SAFE_CALL(cudaMalloc((void**) &(myVar), mem_size_N)); 

更新@talonmies、あなたはcutilライブラリは必要ありません。それでは、ソリューションを書き換えてみましょう:

/* Allocate Data */ 
cudaMalloc((void**) &(myVar), mem_size_N); 

/* Force Thread Synchronization */ 
cudaError err = cudaThreadSynchronize(); 

/* Check for and display Error */ 
if (cudaSuccess != err) 
{ 
    fprintf(stderr, "Cuda error in file '%s' in line %i : %s.\n", 
      __FILE__, __LINE__, cudaGetErrorString(err)); 
} 

そして、他の回答で述べたように - あなたは念APIが正しく初期化するために、あなたの割り当てメモリの前に同期&チェックを含めることができます。

+0

しかし、SDKのcutilsへの依存をあなたのコードに組み込んではいけません。マクロをコピーして使用するだけです(BSDライセンスで問題ありません)。理由の全体のホストのために、cutilsを使用することは悪い考えです。 – talonmies

+0

@talonmies、私はUbuntu、Redhat、Windowsでcutilsを使っていますが問題はありません。あなたが遭遇した問題についてバグレポートや質問を[so]に提出しましたか? –

+2

それはcutilに問題があるわけではありません。ヘッダーとライブラリ関数は、SDKの例をサポートするためだけに存在します。ドキュメンテーションはなく、正確性や機能性についての保証はなく、リリース間で機能が保持されます。 NVIDIAの従業員は、生産コード(例えば、http://forums.nvidia.com/index.php?showtopic=106381&view=findpost&p=586994)や[another](http://forums.nvidia)でcutilを使用しないことを特にお勧めします。 .com/index.php?showtopic = 92389&view = findpost&p = 519951) – talonmies