不带硬件的CUDA编程GPU仿真器

不带硬件的CUDA编程GPU仿真器,cuda,gpu,emulation,cpu,Cuda,Gpu,Emulation,Cpu,问:是否有Geforce卡的仿真器可以让我在没有实际硬件的情况下编程和测试CUDA 信息: 我希望在CUDA中加速我的一些模拟,但我的问题是我并不总是在我的桌面上做这个开发。我想在我的上网本上做一些工作,但是我的上网本没有GPU。现在据我所知,你需要一个有CUDA能力的GPU来运行CUDA。有没有办法绕过这个问题?这似乎是唯一的方法是GPU仿真器(这显然是痛苦的缓慢,但会工作)。但不管怎样,我都想听一听 我在Ubuntu10.04 LTS上编程。CUDA工具包在CUDA 3.0发布周期之前都内

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


信息:

我希望在CUDA中加速我的一些模拟,但我的问题是我并不总是在我的桌面上做这个开发。我想在我的上网本上做一些工作,但是我的上网本没有GPU。现在据我所知,你需要一个有CUDA能力的GPU来运行CUDA。有没有办法绕过这个问题?这似乎是唯一的方法是GPU仿真器(这显然是痛苦的缓慢,但会工作)。但不管怎样,我都想听一听

我在Ubuntu10.04 LTS上编程。

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

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


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

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


正如您所提到的,为缓慢执行做好准备。

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

emulator试图忠实地实现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支持

希望这有帮助

  • [1] :GPU Ocelot-
  • [2] :Ocelot交互式调试器-
对于那些在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)

我会告诉你我学到了什么


  • 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;
    }
    
    我在互联网上发现,如果我使用
    gcc-4.2
    或类似的古老版本而不是
    gcc-4.9.2
    ,错误可能会消失。我放弃了


  • gpuocelot
    斯特林格的答案有一个链接到一个非常古老的
    gpuocelot
    项目网站。所以一开始我以为这个项目是在2012年左右被放弃的。事实上,它在几年后被废弃了

    以下是一些最新的网站:

    • )
    • )
    我尝试安装以下gpuocelot。但我在安装过程中出现了几个错误,我再次放弃了<不再支持code>gpuocelot,它依赖于一组非常特定的库和软件版本

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


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

    这可能有用。这是


  • CUDA废物 它是在Windows7和Windows8上使用的仿真器。不过我还没试过。它似乎不再被开发(最后一次提交日期为2013年7月4日)

    以下是该项目网站的链接:


  • CU2CL 最后更新:12.03.2017

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

    链接:

  • 允许您运行NVIDIA®CUDA™ OpenCL1.2GPU上的程序(完全公开:我是作者)

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

    CUDA emulator已被弃用,您最好看看gpuocelot。此外,CUDA emulator在每个逻辑CUDA线程中使用一个本机操作系统线程,效率极低。令人遗憾的是,这只适用于linux。而我默认是linux用户。我做的一小部分开发是在windows机器上进行的。-deviceemu已被弃用,因此jskaggz答案不太合适。总的来说,这似乎是最好的答案
    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".