我已经在CUDA 4.0CP框架上获得了一个现有的WinForms应用程序,我希望它能够在CUDA设备上进行计算。为此,我决定在C/C++工具包中使用CUDAfy.NET包装器,因为(据我所知)它是CUDA的唯一最新版本。开发在我的机器上没有任何重大问题,但是我在部署到另一个设备时遇到了麻烦。
更具体地说,当我在VS中构建项目,然后在我的机器上运行它时,它运行得很好。但奇怪的是,当初始化nvcc.exe模块时,它会运行CUDAfy,这是CUDAfy的一部分,不应该是必需的。当我试图在任何目标机器上运行二进制文件时,它会抛出这个异常:
无法在路径中找到编译器cl.exe。
这是一个与缺少用于C++编译器的VS工具有关的错误,它不应该出现在目标设备上。现在出现了最奇怪的事情:当我构建CUDAfy.NET附带的示例项目并尝试在目标设备上运行它时,它会抛出相同的异常。
根据CUDAfy.NET测试应用CUDAfy.NET的说法,目标机器没有什么问题,它是兼容的,并且具有CUDA功能。此外,我还在几个不同的设备上测试过,结果总是一样的。我已经跟踪了异常的起源,正如我所指出的,在初始化CUDAfy.NET时会引发该异常:
CudafyModule module = CudafyTranslator.Cudafy();
GPGPU _gpu = CudafyHost.GetDevice(eGPUType.Cuda);
_gpu.LoadModule(module);根据CUDAfy.NET用户手册的说法,它在满足这些要求的设备上应该运行得非常好:
所有这些都是满意的,但仍然不能运行。这就给我带来了麻烦,我被困在那里了。
其中一种可能是,它是由错误的代码编译造成的,而代码的目的是要被篡改。根据手册(我引用),“在部署情况下通常不会使用.NET代码,因为这需要完整的CUDA和Visual。通过使用cudaycl命令行工具,cudafy模块可以在.cdfy文件中松散,也可以嵌入应用程序集中(.exe或.dll)。”这应该是自动完成的,尽管如此,我还是尝试过使用cudaycl,可惜没有任何改进。但是,由于初始化CUDAfy时会出现异常,我认为问题的根源在其他地方。
其他原因可能是,我为特定的体系结构(如CUDA 2.0)构建了二进制文件,然后将其部署到另一个体系结构(例如CUDA 3.0)。在关于nvcc编译器的一节中,CUDA工具包文档提到了一些关于二进制代码的内容:“二进制代码是特定于体系结构的。使用指定目标体系结构的编译器选项-code生成一个cubin对象:例如,用-code=sm_35编译生成具有计算能力3.5的设备的二进制代码。”
不管怎么说,我现在都做不到。我希望你能提供任何帮助和建议。顺便说一下,我使用的是最新的CUDAfy.NET v1.29和CUDA工具包7.0 (CUDAfy.NET还不支持最新版本)。
发布于 2015-11-11 10:27:17
在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模块,并且只有在没有现有模块(或者已经过时)的情况下才会编译一个新模块。因此,您的应用程序将在开发机器上生成模块,然后可以将该应用程序与模块一起分发到其他机器。这些客户端机器将不再尝试生成新模块,因为应用程序没有改变。
如果您已经更改了应用程序,您将不得不运行它(以便它可以重新生成模块),然后重新分发模块与新版本的应用程序。
https://stackoverflow.com/questions/32895454
复制相似问题