2011-08-12 8 views
2

cudacublas、およびcudartにリンクしているプログラムがあります。WindowsにCUDAプログラムを導入するには?

ユーザーに最新のnvidiaドライバをインストールさせないで展開する方法はありますか?

上記のdllを起動パスにコピーすると、プログラムは起動せず、nvcuda.dllに存在しないプロシージャがあると文句を言います。私もこれを供給しても、プログラムは奇妙な動作をします。最新のドライバがインストールされていれば、すべて正常に動作します。

関連する質問...どのように私はcudaがサポートされていることを確認することができます(+最新)と、これは私の場合BLAS/LAPACKのケースフォールバックですか?私がDLLを提供している場合、prog。私がそれらを供給しなければそれは始まらないかもしれません。

Thx!

+0

デバイスがあるかどうかを実行時に確認するための関数['cudaGetDeviceCount'](http://www.clear.rice.edu/comp422/resources/cuda/html/group__CUDART__DEVICE_g665468e8cb33be42434f11bee2684ec9.html)があります。 –

+0

そうですが、始めるにはすべてのDLLが必要です。だから私は彼らに私のプログラムを供給しなければならないでしょう。しかし、私が提供したdllとインストールされたものとの間にバージョンの競合があると、物事が厄介になり始めます。 – FFox

答えて

3

CUDA DLLとリンクせず、動的にロードしてcudaGetDeviceCount()を呼び出してみましたか?このように:

typedef cudaError_t (*FnGetDeviceCount) ( int * count ) ; 
HMODULE hCuda=LoadLibrary("cudart32_40_17.dll"); 
if(!hCuda) return ; // ERROR: cannot load dll, DllMain must have failed because cudart only depends on Kernel dll implicitly. Or cannot find dll in curent directory or in the path. 
FnGetDeviceCount fnGetDeviceCount=(FnGetDeviceCount)GetProcAddress(hCuda, "cudaGetDeviceCount"); 
if(!fnGetDeviceCount) return; // ERROR: cudart has no entry point for cudaGetDeviceCount ?! 
int count = 0; 
if(cudaSuccess != (*fnGetDeviceCount)(&count)) return ;// ERROR: we don't wanna use CUDA if even device enumeration fails 
if(!count) return; // FALLBACK: CUDA has no devices, don't try to use it, fallback to some other BLAS 

あなただけcudartや他のライブラリをリンクすることはできませんので、それは不便だが、それは、ユーザーが恐ろしい起動エラーを見ることなくBLASにフォールバックすることを可能にします。免責事項:私はこのコードをテストしたりコンパイルしたりしていません。もしあなたがそれを使用すれば、私たちに知らせてください:

This threadは、特定のバージョンのCUDAツールキット(例:cudart64_40_17.dll )、それはいいです。

+0

いいね!私はそれを試みます。どうも! – FFox

関連する問題