我在.NET 4.0 CP框架上有一个现有的WinForms应用程序,我希望它在CUDA设备上进行计算。为此,我决定使用CUDAfy.NET包装C / C ++ Toolkit,因为它(据我所知)是唯一一个与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 User Manual,它应该在满足这些要求的设备上运行得非常好:
所有这些都很满意,但仍然无法运行。这让我有一个问题在我身边而且我非常困在那里。
其中一种可能性是它是由错误的代码编译引起的。根据手册,我引用,“你通常不会在你的.NET代码中使用cudafy 部署情况,因为这需要完整的CUDA SDK和Visual Studio。 CUDAfy模块可以在.cdfy文件中松散,也可以通过使用cudaycl命令行工具嵌入到应用程序集(.exe或.dll)中。“。这应该自动完成,但我已尝试使用cudaycl,不幸的是没有改进。但是由于异常发生在初始化CUDAfy时,我认为问题的根源在于其他地方。
可能导致它的另一个原因是我为特定架构(例如CUDA 2.0)构建二进制文件,然后将其部署到另一个架构(例如CUDA 3.0)。有关它的内容在CUDA Toolkit Documentation中有关nvcc编译器的部分中提及:“二进制代码是特定于体系结构的。使用编译器选项-code生成cubin对象,该选项指定目标体系结构:例如,编译with -code = sm_35为计算能力为3.5的设备生成二进制代码。“。
无论如何,我现在无法使其发挥作用。如果您有任何帮助和建议,我将不胜感激。顺便说一句,我使用的是最新的CUDAfy.NET v1.29和CUDA Toolkit 7.0(CUDAfy.NET尚不支持最新版本)。
答案 0 :(得分:0)
在 CUDAfy_User_Manual_1_22.pdf 中,有专门针对该章节的章节。它是用于提高性能的缓存模块"。
public class ArrayBasicIndexing
{
CudafyModule km = CudafyModule.TryDeserialize();
if (km == null || !km.TryVerifyChecksums())
{
km = CudafyTranslator.Cudafy();
km.Serialize();
代码将检查是否已有编译的CUDAfy模块,并且仅在没有现有模块(或它已过期)时才编译新模块。因此,您的应用程序将在您的开发机器上生成模块,然后您可以将带有模块的应用程序分发到其他机器。这些客户端计算机将不再尝试生成新模块,因为应用程序尚未更改。
如果您更改了应用程序,则必须运行它(因此可以重新生成模块),然后使用新版本的应用程序重新分发模块。