如何在Windows上部署CUDA程序?

时间:2011-08-12 13:03:40

标签: windows deployment cuda

我有一个程序链接到cudacublascudart

有没有办法在不强制用户安装最新的nvidia驱动程序的情况下部署它?

当我将上述dll复制到启动路径时,程序无法启动并在nvcuda.dll中抱怨不存在的过程。即使我也提供这个,程序表现得很奇怪。如果安装了最新的驱动程序,一切正常。

相关问题...如何检查cuda是否受支持(+最新),如果不是这种情况,则回退到我的案例中BLAS / LAPACK?如果我提供dll编程。行为不端,如果我不提供它们甚至可能不会开始。

THX!

1 个答案:

答案 0 :(得分: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)重新分发dll,这样就可以了。