2015-10-01 105 views
0

我在.NET 4.0 CP框架上有一个现有的WinForms应用程序,我希望它在CUDA设备上进行计算。为此,我决定在C/C++ Toolkit中使用CUDAfy.NET包装,因为它是(就我所知)唯一一个最新的CUDA SDK。我的机器上的开发没有任何重大问题,但是在部署到其他设备时遇到了麻烦。无法在目标设备上运行CUDAfy.NET应用程序

更具体地说,当我在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 User Manual应该在满足这些要求的设备上运行完全正常Windows 64位

  • .NET 4.0
  • NVIDIA GPU计算能力2.0或更高
  • 到目前为止NVIDIA驱动程序
  • CURAND,CUSPARSE,CUFFT和CUBLAS的DLL,如果使用这些数学库
  • 预编译CUDAfy模块

所有这些都满足,但它仍然无法运行。这给我留下了一个问题,我很困难。

其中一种可能性是它是由错误编译的代码引起的。根据手册,我引用“您通常不会在您的.NET代码中使用 部署情况,因为这需要完整的CUDA SDK和Visual Studio。CUDAfy模块可以放在.cdfy文件中或嵌入您的应用程序中通过使用cudaycl命令行工具组装(.exe或.dll)。“。这应该是自动完成的,但我已经尝试过使用cudaycl,并且没有任何改进。但是,由于初始化CUDAfy时发生异常,我认为问题的根源在其他地方。

还有什么可能导致它是为特定体系结构(例如CUDA 2.0)构建二进制文件,然后将其部署到另一个体系结构(例如CUDA 3.0)。关于它的一些问题在关于nvcc编译器的章节CUDA Toolkit Documentation中提到:“二进制代码是特定于体系结构的。使用指定目标体系结构的编译器选项-code生成cubin对象:例如,使用-code = sm_35进行编译会生成计算能力为3.5的设备的二进制代码。“

不管怎样,我都可以现在不用做它,我会很感激你的帮助和建议。顺便说一句,我使用的是最新的CUDAfy.NET v1.29和CUDA Toolkit 7.0(最新的版本尚未被CUDAfy.NET支持)

+0

从它的外观'CudafyTranslator.Cudafy()'默认需要一个工作工具链。您可能需要找到一种初始化未调用其JIT编译系统的空模块的方法。 CUDAfy.NET中是否有直接的驱动程序API包装? – talonmies

+0

@talonmies我不知道任何直接驱动程序API包装,我不认为有一个在CUDAfy。但它必须以某种方式解决,他们提到在目标机器上运行他们的Cudafied .NET程序。 – SysGen

+0

也,这是http://stackoverflow.com/questions/29430655/avoiding-nvcc-compilation-when-using-cudafy – Val

回答

0

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模块,并且只有在没有现有模块(或已过期)时才会编译新模块。因此,您的应用程序将在您的开发机器上生成模块,然后您可以将该模块的应用程序分发到其他机器。那些客户端机器不会再尝试生成新的模块,因为该应用程序没有改变。

如果您更改了应用程序,则必须运行它(以便它可以重新生成模块),然后使用新版本的应用程序重新分发模块。

相关问题