我在 .NET 4.0 CP 框架上有一个现有的 WinForms 应用程序,我希望它在 CUDA 设备上进行计算。为此,我决定在 C/C++ Toolkit 周围使用CUDAfy.NET包装器,因为它(据我所知)是唯一一个最新的 CUDA SDK。开发在我的机器上没有任何重大问题,但在部署到另一台设备时遇到了麻烦。
更具体地说,当我在 VS 中构建项目然后在我的机器上运行它时,它运行良好。但奇怪的是,它在初始化 CUDAfy 模块时运行 nvcc.exe,这是 CUDA SDK 的一部分,在那里不需要。当我尝试在任何目标机器上运行二进制文件时,它会抛出这个异常:
在路径中找不到编译器 cl.exe。
这是与缺少 C++ 编译器的 VS 工具相关的错误,它不应该出现在目标设备上。现在最奇怪的事情来了;当我构建 CUDAfy.NET 附带的示例项目并尝试在目标设备上运行它时,它会引发相同的异常。
目标机器没有任何问题,根据 CUDAfy.NET 测试应用程序Cudafy Viewer,它兼容并且具有 CUDA 功能。此外,我已经在几种不同的设备上对其进行了测试,结果总是相同。我已经追踪了异常的起源,正如我在初始化 CUDAfy.NET 时指出的那样:
CudafyModule module = CudafyTranslator.Cudafy();
GPGPU _gpu = CudafyHost.GetDevice(eGPUType.Cuda);
_gpu.LoadModule(module);
根据CUDAfy.NET 用户手册,它应该在满足以下要求的设备上运行良好:
- Windows 64 位
- .NET 4.0
- 具有计算能力 2.0 或更高版本的 NVIDIA GPU
- 最新的 NVIDIA 驱动程序
- CURAND、CUSPARSE、CUFFT 和 CUBLAS dll(如果使用这些数学库)
- 预编译的 CUDAfy 模块
所有这些都满足了,但它仍然没有运行。这给我留下了一个问题,我被困在那里。
一种可能性是它是由错误编译的代码导致的。根据手册,我引用,“您通常不会在部署情况下使用 .NET 代码,因为这需要完整的 CUDA SDK 和 Visual Studio。CUDAfy 模块可以在 .cdfy 文件中松散或嵌入到您的应用程序程序集中( .exe 或 .dll)通过使用 cudaycl 命令行工具。” . 这应该是自动完成的,尽管如此我已经尝试使用 cudaycl,但不幸的是没有任何改进。但由于初始化 CUDAfy 时发生异常,我认为问题的根源在其他地方。
还有什么可能导致它是我为特定架构(例如 CUDA 2.0)构建二进制文件,然后将其部署到另一个(例如 CUDA 3.0)。CUDA Toolkit Documentation中关于 nvcc 编译器的部分中提到了一些关于它的内容: “二进制代码是特定于体系结构的。使用指定目标体系结构的编译器选项 -code 生成 cubin 对象:例如,使用 -code=sm_35 进行编译为计算能力为 3.5 的设备生成二进制代码。” .
无论如何,我现在无法让它工作。如果您有任何帮助和建议,我将不胜感激。顺便说一句,我使用的是最新的 CUDAfy.NET v1.29 和 CUDA Toolkit 7.0(CUDAfy.NET 还不支持最新的)。