Вы пытались не связываться с dll-файлами CUDA, а загружать их динамически и вызывать 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, не увидев при этом ужасных ошибок при запуске. Отказ от ответственности: я не тестировал и даже не компилировал этот код, пожалуйста, сообщите нам, если вы используете его, и он работает:)
Этот поток предлагает вам перераспределить dll из вашей конкретной версии инструментария CUDA (например, cudart64_40_17.dll), так что все в порядке.