我有一个程序链接到cuda
,cublas
和cudart
。
有没有办法在不强制用户安装最新的nvidia驱动程序的情况下部署它?
当我将上述dll复制到启动路径时,程序无法启动并在nvcuda.dll
中抱怨不存在的过程。即使我也提供这个,程序表现得很奇怪。如果安装了最新的驱动程序,一切正常。
相关问题...如何检查cuda是否受支持(+最新),如果不是这种情况,则回退到我的案例中BLAS / LAPACK?如果我提供dll编程。行为不端,如果我不提供它们甚至可能不会开始。
THX!
答案 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,这样就可以了。