118

问题:是否有 Geforce 卡的模拟器可以让我在没有实际硬件的情况下编程和测试 CUDA?


信息:

我希望在 CUDA 中加快我的一些模拟,但我的问题是我并不总是在我的桌面上进行这个开发。我想在我的上网本上做一些工作,但我的上网本没有 GPU。现在据我所知,您需要一个支持 CUDA 的 GPU 来运行 CUDA。有没有办法解决这个问题?似乎唯一的方法是使用 GPU 模拟器(这显然会非常缓慢,但可以工作)。但无论有什么方法可以做到这一点,我想听听。

我在 Ubuntu 10.04 LTS 上编程。

4

7 回答 7

43

这种反应可能为时已晚,但无论如何都值得注意。如果您希望使用模拟器或 LLVM 后端,GPU Ocelot我是其中的核心贡献者之一)可以在不安装 CUDA 设备驱动程序 (libcuda.so) 的情况下进行编译。我已经在没有 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 的支持!

希望这可以帮助。

于 2011-01-21T22:06:44.853 回答
42

对于那些在 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.0nvcc中,/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. gpuocelot

    Stringer 的答案有一个非常古老的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

    最后更新:2017 年 3 月 12 日

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

    链接:

于 2016-03-29T00:25:11.590 回答
36

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

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

于 2010-06-21T19:20:34.387 回答
14

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

于 2010-06-21T18:33:28.093 回答
10

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

于 2016-10-20T02:49:35.790 回答
3

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

正如你所提到的,准备一些缓慢的执行。

于 2010-06-21T20:31:32.140 回答
1

GPGPU-Sim是一个 GPU 模拟器,可以在不使用 GPU 的情况下运行 CUDA 程序。我为自己创建了一个安装了 GPGPU-Sim 的docker 映像,以防万一。

于 2019-07-08T01:24:22.353 回答