用于CUDA编程的GPU仿真器,无需硬件

问题:是否有一个用于Geforce卡的仿真器,可以让我编程和testingCUDA而不需要实际的硬件?


信息:

我期望在CUDA中加速一些我的模拟,但是我的问题是我并不总是在我的桌面上进行这种开发。 我想在我的上网本上做一些工作,但我的上网本没有GPU。 现在据我所知,你需要一个支持CUDA的GPU来运行CUDA。 有没有办法解决这个问题? 这似乎是唯一的方法是GPU模拟器(显然会很痛苦,但会起作用)。 但是,无论如何,我希望听到这样做。

我在Ubuntu 10.04 LTS上进行编程。

对于那些在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 ,错误可能会消失。 我放弃。


  2. gpuocelot

    斯金格的答案有一个很老的gpuocelot项目网站的链接。 所以一开始我以为这个项目在2012年左右就放弃了。 实际上,几年之后就被放弃了。

    以下是一些最新的网站:

    • GitHub ;
    • 项目网站 ;
    • 安装指南 。

    我试图按照指南安装gpuocelot。 我在安装过程中遇到了一些错误,但是我又放弃了。 gpuocelot不再受支持,依赖于一组非常特定的库和软件版本。

    您可能会尝试从2015年7月开始学习本教程 ,但我不保证它能正常工作。 我没有testing过


  3. MCUDA

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

    这可能是有用的。 这是一个链接到网站 。


  4. CUDA废物

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

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


  1. CU2CL

    最后更新:12.03.2017

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

    链接:

    • CU2CL主页
    • CU2CL GitHub存储库

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

仿真器试图忠实地实现PTX 1.4和PTX 2.1规范,其中可能包括旧版GPU不支持的function。 LLVM翻译器致力于从PTX到x86的正确高效翻译,希望能够使CUDA成为编程多核CPU和GPU的有效方式。 -deviceemu已经被CUDA弃用了很长一段时间,但是LLVM翻译器一直比较快。

此外,仿真器中内置了多个正确性检查器,用于validationalignment的内存访问,对共享内存的访问是否正确同步以及全局内存解引用是否访问已分配的内存区域。 我们还实现了一个命令行交互式debugging器,主要由gdb启发,通过CUDA内核单步执行,设置断点和观察点等。这些工具专门用于加快CUDA程序的debugging; 你可能会发现它们很有用。

对于仅Linux的方面感到抱歉。 我们已经开始了一个Windows分支机构( 以及一个Mac OS X端口 ),但是工程负担已经足够大,以强调我们的研究工作。 如果有人有任何时间和兴趣,他们可能希望帮助我们提供对Windows的支持!

希望这可以帮助。

您也可以检查gpuocelot项目,它是一个真正的模拟器,在PTX(CUDA代码转换为的字节码)模拟的意义上说。

还有一个LLVM翻译器,testing它是否比使用-deviceemu更快。

CUDA工具包内置一个工具包,直到CUDA 3.0发布周期。 我使用这些非常旧的CUDA版本之一,确保使用nvcc编译时使用-deviceemu。

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

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

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