无需硬件即可进行CUDA编程的GPU仿真器


111

问题:是否有用于Geforce卡的仿真器,可让我在没有实际硬件的情况下对CUDA进行编程和测试?


信息:

我希望加快CUDA中我的模拟速度,但是我的问题是,我并不总是在桌面上进行此开发。我想在上网本上做一些工作,但是上网本没有GPU。现在,据我所知,您需要具有CUDA功能的GPU才能运行CUDA。有办法解决这个问题吗?看来唯一的方法就是使用GPU仿真器(显然它会很慢,但可以正常工作)。但是,我想听听用什么方法做到这一点。

我正在Ubuntu 10.04 LTS上编程。


Answers:


39

对于那些在2016年(甚至2017年)寻求答案的人...


免责声明

  • 我毕竟无法模拟GPU。
  • gpuocelot如果满足其依赖关系列表,则可能可以使用。

我已经尝试为BunsenLabs(Linux 3.16.0-4-686-pae#1 SMP Debian 3.16.7-ckt20-1 + deb8u4(2016-02-29)i686 GNU / Linux)创建了一个仿真器。

我会告诉你我学到的东西。


  1. nvcc过去-deviceemu在CUDA Toolkit 3.0中具有选项

    我下载了CUDA Toolkit 3.0,将其安装并尝试运行一个简单程序:

    #include <stdio.h>
    
    __global__ void helloWorld() {
        printf("Hello world! I am %d (Warp %d) from %d.\n",
            threadIdx.x, threadIdx.x / warpSize, blockIdx.x);
    }
    
    int main() {
        int blocks, threads;
        scanf("%d%d", &blocks, &threads);
        helloWorld<<<blocks, threads>>>();
        cudaDeviceSynchronize();
        return 0;
    }

    请注意,CUDA Toolkit 3.0 nvcc在中/usr/local/cuda/bin/

    事实证明,我在编译它时遇到了困难:

    NOTE: device emulation mode is deprecated in this release
          and will be removed in a future release.
    
    /usr/include/i386-linux-gnu/bits/byteswap.h(47): error: identifier "__builtin_bswap32" is undefined
    
    /usr/include/i386-linux-gnu/bits/byteswap.h(111): error: identifier "__builtin_bswap64" is undefined
    
    /home/user/Downloads/helloworld.cu(12): error: identifier "cudaDeviceSynchronize" is undefined
    
    3 errors detected in the compilation of "/tmp/tmpxft_000011c2_00000000-4_helloworld.cpp1.ii".

    我在Internet上发现,如果我使用gcc-4.2或类似的方式来代替,gcc-4.9.2错误可能会消失。我放弃。


  2. gpuocelot

    斯金格的答案有一个非常老的gpuocelot项目网站的链接。因此,起初我以为该项目在2012年左右就被放弃了。实际上,几年后它被废弃了。

    以下是一些最新的网站:

    我尝试按照指南安装gpuocelot 。我在安装过程中遇到了几个错误,但我又放弃了。gpuocelot不再受支持,它取决于一组非常特定的库和软件版本。

    您可能会尝试从2015年7月开始阅读本教程,但我不能保证它会起作用。我还没有测试。


  3. 微控制器

    MCUDA转换框架是基于Linux的工具,旨在将CUDA编程模型有效地编译为CPU架构。

    这可能很有用。这是网站的链接


  4. CUDA废物

    它是在Windows 7和8上使用的仿真器。虽然我没有尝试过。它似乎不再开发了(最后一次提交日期为2013年7月4日)。

    这是项目网站的链接:https : //code.google.com/archive/p/cuda-waste/


  1. CU2CL

    最近更新:12.03.2017

    作为dashesy在评论中指出,CU2CL似乎是一个有趣的项目。它似乎能够 CUDA代码转换为OpenCL代码。因此,如果您的GPU能够运行OpenCL代码,则您可能会喜欢CU2CL项目。

    链接:


4
这是一种耻辱!由于不提供慢速路径,因此很难在任何机器上构建和测试应用程序。这意味着,开发人员应避免对Cuda添加依赖性。业余爱好者和研究人员仍可将其用于一次性项目。不适用于客户的实际应用。
破旧的

3
CU2CL似乎很活跃,也值得一看。
破旧的

1
1. nvcc -deviceemu
Nathan

2
4.开始CUDA Waste工作
Nathan

2
5.开始CU2CL工作
Nathan

41

此响应可能为时已晚,但是仍然值得注意。如果您希望使用Emulator或LLVM后端,则可以在不安装CUDA设备驱动程序(libcuda.so)的情况下编译GPU Ocelot我是其中的主要贡献者)。我已经在没有NVIDIA GPU的系统上演示了该模拟器。

仿真器尝试忠实地实现PTX 1.4和PTX 2.1规范,这些规范可能包括较旧的GPU不支持的功能。LLVM转换器努力将PTX正确正确地转换为x86,这有望使CUDA成为对多核CPU和GPU进行编程的有效方法。-deviceemu在相当长的一段时间内,CUDA一直不推荐使用它,但是LLVM转换器始终更快。

此外,模拟器中还内置了几个正确性检查器,以进行以下验证:对齐的内存访问,对共享内存的访问已正确同步,并且全局内存取消了对分配给内存区域的访问的引用。我们还实现了一个命令行交互式调试器,该调试器的灵感主要来自于gdb,它可以单步浏览CUDA内核,设置断点和观察点等。您可能会发现它们很有用。

对不起,仅Linux方面。我们已经启动了Windows分支(以及Mac OS X端口),但是工程负担已经很大,足以强调我们的研究追求。如果任何人有时间和兴趣,他们可能希望帮助我们为Windows提供支持!

希望这可以帮助。


3
嗨-您还在吗?是否有任何文档说明如何在现有CUDA构建环境中使用Ocelot构建程序?另外,Ocelot是否可以与Thrust配合使用?
Kerrek SB 2011年

可以通过GitHub gtcasl / gpuocelot找到最新的GPU Ocelot源代码。
l --marc l 17-11-18

36

您还可以检查gpuocelot项目,这是一个真正的模拟器,可以模拟PTX(转换为CUDA代码的字节码)。

还有一个LLVM转换器,测试它是否比使用-deviceemu时更快更有趣。


可悲的是,这仅适用于linux。在我默认情况下是Linux用户的情况下。我所做的少量开发工作是在Windows计算机上进行的。-deviceemu已弃用,因此jskaggz的答案不太合适。总的来说,这似乎是最好的答案。
Narcolapser

14

直到CUDA 3.0发布周期为止,CUDA工具箱内置了该工具箱。我使用的是CUDA的非常旧的版本之一,请确保在使用nvcc进行编译时使用-deviceemu。


4
CUDA仿真器已被弃用,您最好查看gpuocelot。
汤姆(Tom)2010年

1
另外,CUDA仿真器每个逻辑CUDA线程使用一个本机OS线程,这效率极低。
斯金格

9

https://github.com/hughperkins/cuda-on-cl允许您在OpenCL 1.2 GPU上运行NVIDIA®CUDA™程序(全部披露:我是作者)


我也可以在CPU上运行它吗?
Mateusz Piotrowski

仅GPU。需要OpenCL 1.2 GPU或更高版本。
休·帕金斯

1
您可能可以使用jrprice.com/Oclgrind在CPU上运行它,但我想那可能不是您的意思;-)。我猜Coriander(新名称)可能也可以在CPU OpenCL上运行,但是我从未测试过。可能需要一些刺激。
休·帕金斯

3

使用-deviceemu进行编程时请务必小心,因为在仿真模式下,nvcc会接受某些操作,而在GPU上实际运行时则不会。这主要是在设备与主机的交互中发现的。

正如您提到的,准备执行一些缓慢的操作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.