0

我在 .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 还不支持最新的)。

4

1 回答 1

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

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

于 2015-11-11T10:27:17.707 回答