没有硬件的情况下进行CUDA编程的GPU仿真器

134

问题:是否有一种GeForce显卡的仿真器,能让我在没有实际硬件的情况下编写和测试CUDA程序?


信息:

我想在CUDA中加速我的一些模拟,但我的问题是我并不总是围绕着桌面来进行这个开发。我想在我的netbook上完成一些工作,但我的netbook没有GPU。据我所知,您需要一个CUDA兼容的GPU才能运行CUDA。有什么方法可以解决这个问题吗?似乎唯一的方法是使用GPU模拟器(显然会非常慢,但可行)。但无论如何,我都希望了解到如何解决这个问题。

我正在Ubuntu 10.04 LTS上编程。


相关:使用AMD GPU:https://dev59.com/5Wcs5IYBdhLWcg3wdzxm,使用英特尔集成显卡:https://dev59.com/O2sy5IYBdhLWcg3w-i7h - Ciro Santilli OurBigBook.com
7个回答

45
这个回答可能有点晚,但仍然值得注意。GPU Ocelot(我是其中一个核心贡献者)可以在没有安装CUDA设备驱动程序(libcuda.so)的情况下进行编译,如果您想使用模拟器或LLVM后端。我已经在没有NVIDIA GPU的系统上演示了模拟器。
模拟器试图忠实地实现PTX 1.4和PTX 2.1规范,其中可能包括旧GPU不支持的功能。LLVM翻译器力求从PTX到x86的正确且高效的翻译,这将使CUDA成为一种有效的编程多核CPU以及GPU的方式。-deviceemu已经是CUDA的一个弃用功能很长一段时间了,但LLVM翻译器一直更快。
此外,模拟器内置了几个正确性检查器,以验证:对齐的内存访问、对共享内存的访问被正确同步,以及全局内存解引用访问分配的内存区域。我们还实现了一个命令行交互式调试器,受gdb的启发,可以逐步执行CUDA内核,设置断点和监视点等等...这些工具专门用于加速CUDA程序的调试;您可能会发现它们有用。
抱歉只支持Linux。我们已经开始了Windows分支(以及Mac OS X移植),但工程负担已经足够大,以至于我们的研究追求受到了压力。如果有人有时间和兴趣,他们可能希望帮助我们为Windows提供支持!
希望这有所帮助。

3
你好 - 你还在吗?有没有关于如何在现有的CUDA构建环境中使用Ocelot构建程序的文档?此外,Ocelot是否与Thrust兼容? - Kerrek SB
更近期的GPU Ocelot源代码可以通过GitHub gtcasl/gpuocelot找到。 - l --marc l

45

对于那些在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曾经在CUDA Toolkit 3.0中有一个-deviceemu选项

    我下载了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".
    

    我在网上找到了一些资料,说如果使用gcc-4.2或类似的古老版本而不是gcc-4.9.2,那么错误可能会消失。我放弃了。


    gpuocelot

    Stringer的答案中提供了一个非常古老的gpuocelot项目网站链接。所以我一开始以为这个项目在2012年左右就被放弃了。实际上,它在几年后才被放弃。

    这里有一些最新的网站:

    我尝试按照指南来安装gpuocelot。然而在安装过程中出现了几个错误,我又放弃了。 gpuocelot不再得到支持,并且依赖于一组非常特定的库和软件版本。

    您可以尝试按照这篇教程从2015年7月开始,但我不能保证它会起作用。我没有测试过。


    MCUDA

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

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


    CUDA Waste

    这是一个可以在Windows 7和8上使用的模拟器。虽然我没有尝试过,但它似乎不再开发(最后一次提交日期为2013年7月4日)。

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


    CU2CL

    最近更新:12.03.2017

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

    链接:


4
太可惜了!如果没有提供一个缓慢的路径,就很难在任何机器上构建和测试应用程序。这意味着开发人员应该避免添加对Cuda的依赖。它仍然可以被爱好者和研究人员用于一次性项目,但不适合为客户开发真正的应用程序。 - dashesy
3
CU2CL 似乎很活跃,也值得关注。 - dashesy
1
  1. 成功让 gpuocelot 运行。
- Nathan majicvr.com
3
我已经成功地使用了“CUDA Waste”。 - Nathan majicvr.com
2
  1. 成功让 CU2CL 运行
- Nathan majicvr.com
显示剩余8条评论

36

你也可以查看gpuocelot项目,它是一个真正的仿真器,因为PTX(将CUDA代码转换为的字节码)将被仿真。

还有一个LLVM翻译器,有趣的是测试一下是否比使用-deviceemu更快。


遗憾的是,这只适用于Linux。虽然我默认使用Linux,但我所做的一小部分开发是在Windows机器上进行的。-deviceemu已被弃用,因此jskaggz的答案并不完全适用。总的来说,这似乎是最好的答案。 - Narcolapser

14

CUDA工具包在CUDA 3.0版本之前已经内置了一个模拟器。如果您使用这些非常旧的CUDA版本,请在使用nvcc编译时确保使用-deviceemu选项。


4
CUDA模拟器已被弃用,你最好看一下gpuocelot。 - Tom
1
Plus CUDA模拟器每个逻辑CUDA线程使用一个本地操作系统线程,这非常低效。 - elmattic

11

我可以在CPU上运行它吗? - Mateusz Piotrowski
仅支持GPU。需要OpenCL 1.2 GPU或更高版本。 - Hugh Perkins
1
您可能可以在 CPU 上运行它,使用 https://jrprice.com/Oclgrind ,但我猜这可能不是您想要的;-)。 我猜 Coriander(新名称)也可能可以在 CPU OpenCL 上运行,但我从未测试过。可能需要一点点推动。 - Hugh Perkins

3
请注意,在使用-deviceemu进行编程时要小心,因为在仿真模式下nvcc会接受某些操作,但实际运行在GPU上时则不会。这主要涉及设备和主机的交互。
正如您所提到的,要准备一些缓慢的执行时间。

1

GPGPU-Sim 是一个 GPU 模拟器,可以在不使用 GPU 的情况下运行 CUDA 程序。我创建了一个 Docker 镜像,其中安装了 GPGPU-Sim,以便于自己使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接