不能运行CUDAfy.. NET应用程序在目标设备上
本文关键字:目标 应用程序 运行 CUDAfy NET 不能 | 更新日期: 2023-09-27 18:15:38
我在。net 4.0 CP框架上有一个现有的WinForms应用程序,我想让它在CUDA设备上进行计算。为此,我决定使用CUDAfy。. NET包装围绕C/c++工具包,因为它是(据我所知)唯一一个最新的CUDA SDK。在我的机器上进行开发没有任何重大问题,但是在部署到另一台设备时遇到了麻烦。
更具体地说,当我在VS中构建项目然后在我的机器上运行它时,它运行得很好。但奇怪的是,它在初始化CUDAfy模块时运行nvcc.exe,这是CUDA SDK的一部分,不应该在那里被要求。当我试图在任何目标机器上运行二进制文件时,它会抛出这个异常:在path.
中找不到编译器cl.exe
这是一个与c++编译器缺少VS工具有关的错误,它不应该出现在目标设备上。现在最奇怪的事情来了;当我构建CUDAfy附带的示例项目时。. NET并尝试在目标设备上运行它,它会抛出相同的异常。
根据CUDAfy的说法,目标机器没有任何问题。. NET测试应用程序Cudafy查看器它是兼容的,它有CUDA功能。此外,我在几个不同的设备上测试了它,结果总是一样的。我已经跟踪了异常的起源,正如我所指出的,它是在初始化CUDAfy时抛出的。净:CudafyModule module = CudafyTranslator.Cudafy();
GPGPU _gpu = CudafyHost.GetDevice(eGPUType.Cuda);
_gpu.LoadModule(module);
根据CUDAfy。. NET用户手册,它应该在满足这些要求的设备上运行得很好:
- Windows 64位
- 。NET 4.0
- NVIDIA GPU,计算能力2.0或更高
- 最新NVIDIA驱动
- CURAND, CUSPARSE, CUFFT和CUBLAS dll如果使用这些数学库
- 预编译CUDAfy模块
所有这些都满足,但它仍然不运行。这给我留下了一个问题,我被困在那里了。
其中一种可能是由于错误编译了想要cuded的代码而导致的。根据手册,我引用,"您通常不会在。net代码中编写因为这需要完整的CUDA SDK和Visual Studio。CUDAfy模块可以在。cdfy文件中松散或通过使用cudaycl命令行工具嵌入到应用程序程序集(.exe或。dll)中。"。这应该是自动完成的,尽管如此,我已经尝试使用cudaycl,不幸的是没有改进。但是由于异常发生在初始化CUDAfy时,我认为问题的根源在其他地方。
其他可能导致它的原因是我为特定架构(例如CUDA 2.0)构建二进制文件,然后将其部署到另一个架构(例如CUDA 3.0)。在CUDA Toolkit文档中关于nvcc编译器的部分中提到了一些相关内容:"二进制代码是特定于体系结构的。使用指定目标体系结构的编译器选项-code生成一个cubin对象:例如,使用-code=sm_35编译会为计算能力为3.5的设备生成二进制代码。不管怎样,我现在没法让它工作。我将感谢您的任何帮助和建议。顺便说一下,我用的是最新的CUDAfy。.NET v1.29和CUDA Toolkit 7.0(最新版本尚未被CUDAfy.NET支持)。
在CUDAfy_User_Manual_1_22.pdf有一个章节专门用于此。是"5.2缓存模块来提高性能"。
public class ArrayBasicIndexing
{
CudafyModule km = CudafyModule.TryDeserialize();
if (km == null || !km.TryVerifyChecksums())
{
km = CudafyTranslator.Cudafy();
km.Serialize();
代码将检查是否已经有一个编译的CUDAfy模块,并且只有在没有现有模块(或者它已经过时)的情况下才会编译一个新的模块。因此,你的应用程序将在你的开发机器上生成模块,然后你可以将应用程序与模块一起分发到其他机器上。这些客户端机器将不再尝试生成新的模块,因为应用程序没有更改。
如果你改变了应用,你必须运行它(这样它才能重新生成模块),然后用新版本的应用重新分发模块。