GPU 模拟器的 CUDA 编程没有硬件

问: 是否有一个 Geforce 卡的模拟器,允许我在没有实际硬件的情况下编程和测试 CUDA?


资讯:

I'm looking to speed up a few simulations of mine in CUDA, but my problem is that I'm not always around my desktop for doing this development. I would like to do some work on my netbook instead, but my netbook doesn't have a GPU. Now as far as I know, you need a CUDA capable GPU to run CUDA. Is there a way to get around this? It would seem like the only way is a GPU emulator (which obviously would be painfully slow, but would work). But whatever way there is to do this I would like to hear.

我在 Ubuntu 10.04 LTS 上编程。

91047 次浏览

CUDA 工具包 曾经一直到 CUDA 3.0发布周期。我你使用这些非常老的 CUDA 版本之一,确保使用-deviceemu 编译与 nvcc。

You can check also Gpuocelot project which is a true emulator in the sense that PTX (bytecode in which CUDA code is converted to) will be emulated.

还有一个 LLVM 翻译器,测试它是否比使用-deviceemu 时更快会很有趣。

在使用-deviceemu 编程时要小心,因为在模拟模式下,nvcc 会接受一些操作,但在 GPU 上实际运行时则不会接受这些操作。这通常是在设备-主机交互中发现的。

如你所说,准备好慢慢执行吧。

这种反应可能太迟了,但是无论如何都值得注意。如果您希望使用模拟器或 LLVM 后端,可以在不安装 CUDA 设备驱动程序(libcoua.so)的情况下编译 豹猫(我是其中的核心贡献者之一)。我已经在没有 NVIDIA 图形处理器的系统上演示了模拟器。

该模拟器试图忠实地实现 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 的支持!

希望这个能帮上忙。

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


Disclaimer

  • 毕竟我没能模仿 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. 在 CUDA Toolkit 3.0中,nvcc曾经有一个 -deviceemu选项

    I downloaded CUDA Toolkit 3.0, installed it and tried to run a simple 程序:

    #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 工具包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的错误可能会消失。我放弃了。


  2. Stringer 的答案是一个非常老的 gpuocelot项目网站的链接。所以一开始我以为这个项目在2012年左右就被放弃了。事实上,几年后它就被废弃了。

    以下是一些最新的网站:

    我试着在 向导后面安装 gpuocelot。但是在安装过程中我出现了一些错误,所以我再次放弃了。gpuocelot不再受支持,它依赖于一组非常特定的库和软件版本。

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


  3. MCUDA

    The MCUDA translation framework is a linux-based tool designed to effectively compile the CUDA programming model to a CPU architecture.

    可能有用,这是 该网站的链接


  4. CUDA 废物

    这是一个在 Windows7和 Windows8上使用的模拟器。我还没试过。它似乎不再被开发(最后一次提交的日期是2013年7月4日)。

    Here's the link to the project's website: https://code.google.com/archive/p/cuda-waste/


  1. CU2CL

    Last update: 12.03.2017

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

    Links:

https://github.com/hughperkins/cuda-on-cl lets you run NVIDIA® CUDA™ programs on OpenCL 1.2 GPUs (full disclosure: I'm the author)

GPGPU-Sim 是一个 GPU 模拟器,可以在不使用 GPU 的情况下运行 CUDA 程序。 我创建了一个与 GPGPU-Sim 安装为自己的情况下,这是有帮助的 码头图像