问题:是否有Geforce卡的仿真器,可以让我在没有实际硬件的情况下编程和测试CUDA?
信息:
我想在CUDA中加速我的一些模拟,但我的问题是我并不总是在我的桌面上进行这种开发 . 我想在我的上网本上做一些工作,但我的上网本没有GPU . 据我所知,你需要一个支持CUDA的GPU来运行CUDA . 有办法解决这个问题吗?看起来唯一的方法是GPU模拟器(显然会很慢,但会起作用) . 但无论如何,我想听听 .
我在Ubuntu 10.04 LTS上编程 .
毕竟我没能模仿GPU .
如果满足其依赖项列表,则可以使用 gpuocelot .
gpuocelot
我试图为BunsenLabs获得一个模拟器(Linux 3.16.0-4-686-pae#1 SMP Debian 3.16.7-ckt20-1 deb8u4(2016-02-29)i686 GNU / Linux) .
我会告诉你我学到了什么 .
我下载了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/ .
nvcc
/usr/local/cuda/bin/
原来我编译时遇到了困难:
注意:此版本中不推荐使用设备仿真模式并将在以后的版本中删除 .
/usr/include/i386-linux-gnu/bits/byteswap.h(47):错误:标识符“__builtin_bswap32”未定义
/usr/include/i386-linux-gnu/bits/byteswap.h(111):错误:标识符“__builtin_bswap64”未定义
/home/user/Downloads/helloworld.cu(12):错误:标识符“cudaDeviceSynchronize”未定义
在编译“/tmp/tmpxft_000011c2_00000000-4_helloworld.cpp1.ii”中检测到3个错误 .
我在互联网上发现,如果我使用 gcc-4.2 或类似古代而不是 gcc-4.9.2 ,错误可能会消失 . 我放弃 .
gcc-4.2
gcc-4.9.2
斯特林格的答案链接到一个非常古老的项目网站 . 所以起初我认为该项目在2012年左右被放弃了 . 实际上,它在几年后被放弃了 .
以下是一些最新的网站:
GitHub;
Project's website;
Installation guide .
我尝试在the guide之后安装gpuocelot . 我在安装过程中遇到了几个错误,但我又放弃了 . gpuocelot 不再受支持,取决于一组非常特定的库和软件版本 .
您可能会尝试从2015年7月起遵循this tutorial但我不会't guarantee it'工作 . 我没有测试过它 .
MCUDA转换框架是一个基于Linux的工具,旨在将CUDA编程模型有效地编译为CPU架构 .
它可能有用 . 这是a link to the website .
它是在Windows 7和8上使用的模拟器 . 我没试过它 . 它似乎不再开发(最后一次提交日期为2013年7月4日) .
这里's the link to the project'的网站:https://code.google.com/archive/p/cuda-waste/
最后更新:12.03.2017
正如dashesy在评论中指出的那样,CU2CL似乎是一个有趣的项目 . 它似乎能够将CUDA代码转换为OpenCL代码 . 因此,如果您的GPU能够运行OpenCL代码,那么CU2CL项目可能是您感兴趣的 .
链接:
CU2CL homepage
CU2CL GitHub repository
这种反应可能为时已晚,但无论如何都值得注意 . 如果您希望使用仿真器或LLVM后端,则可以在未安装CUDA设备驱动程序(libcuda.so)的情况下编译GPU Ocelot(其中我是核心贡献者之一) . 我在没有NVIDIA GPU的系统上演示了仿真器 .
仿真器试图忠实地实现PTX 1.4和PTX 2.1规范,其中可能包括旧GPU不支持的功能 . LLVM转换器致力于从PTX到x86的正确和高效转换,这有望使CUDA成为编程多核CPU和GPU的有效方法 . -deviceemu 已经被CUDA弃用了很长一段时间,但LLVM转换器一直都比较快 .
-deviceemu
此外,在仿真器中内置了几个正确性检查器以验证:对齐的内存访问,对共享内存的访问是否正确同步,以及全局内存解除引用访问分配的区域记忆我们还实现了一个主要由gdb启发的单一步骤通过CUDA内核,设置断点和观察点等......这些工具专门用于加快CUDA程序的调试;你会发现它们很有用 .
对于仅限Linux的方面感到抱歉 . 我们已经启动了Windows分支(以及Mac OS X端口),但工程负担已经足够大,足以强调我们的研究追求 . 如果有人有任何时间和兴趣,他们可能希望帮助我们为Windows提供支持!
希望这可以帮助 .
[1]:GPU Ocelot - https://code.google.com/archive/p/gpuocelot/
[2]:Ocelot Interactive Debugger - http://forums.nvidia.com/index.php?showtopic=174820
您还可以检查gpuocelot项目,这是一个真正的模拟器,因为将模拟PTX(转换为CUDA代码的字节码) .
还有一个LLVM转换器,测试它是否比使用-deviceemu时更快是有趣的 .
CUDA工具包内置了一个,直到CUDA 3.0发布周期 . 我使用其中一个非常旧版本的CUDA,确保在使用nvcc编译时使用-deviceemu .
https://github.com/hughperkins/cuda-on-cl允许您在OpenCL 1.2 GPU上运行NVIDIA®CUDA™程序(完全披露:我是作者)
使用-deviceemu进行编程时要小心,因为nvcc在仿真模式下会接受这些操作,但在GPU上实际运行时则不然 . 这主要与设备 - 主机交互有关 .
正如你所提到的,准备一些缓慢的执行 .
6 回答
对于那些在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,安装它并尝试运行一个简单的程序:
请注意,在CUDA Toolkit 3.0中
nvcc
位于/usr/local/cuda/bin/
.原来我编译时遇到了困难:
/usr/include/i386-linux-gnu/bits/byteswap.h(47):错误:标识符“__builtin_bswap32”未定义
/usr/include/i386-linux-gnu/bits/byteswap.h(111):错误:标识符“__builtin_bswap64”未定义
/home/user/Downloads/helloworld.cu(12):错误:标识符“cudaDeviceSynchronize”未定义
在编译“/tmp/tmpxft_000011c2_00000000-4_helloworld.cpp1.ii”中检测到3个错误 .
我在互联网上发现,如果我使用
gcc-4.2
或类似古代而不是gcc-4.9.2
,错误可能会消失 . 我放弃 .gpuocelot
斯特林格的答案链接到一个非常古老的项目网站 . 所以起初我认为该项目在2012年左右被放弃了 . 实际上,它在几年后被放弃了 .
以下是一些最新的网站:
GitHub;
Project's website;
Installation guide .
我尝试在the guide之后安装gpuocelot . 我在安装过程中遇到了几个错误,但我又放弃了 .
gpuocelot
不再受支持,取决于一组非常特定的库和软件版本 .您可能会尝试从2015年7月起遵循this tutorial但我不会't guarantee it'工作 . 我没有测试过它 .
MCUDA
它可能有用 . 这是a link to the website .
CUDA浪费
它是在Windows 7和8上使用的模拟器 . 我没试过它 . 它似乎不再开发(最后一次提交日期为2013年7月4日) .
这里's the link to the project'的网站:https://code.google.com/archive/p/cuda-waste/
CU2CL
最后更新:12.03.2017
正如dashesy在评论中指出的那样,CU2CL似乎是一个有趣的项目 . 它似乎能够将CUDA代码转换为OpenCL代码 . 因此,如果您的GPU能够运行OpenCL代码,那么CU2CL项目可能是您感兴趣的 .
链接:
CU2CL homepage
CU2CL GitHub repository
这种反应可能为时已晚,但无论如何都值得注意 . 如果您希望使用仿真器或LLVM后端,则可以在未安装CUDA设备驱动程序(libcuda.so)的情况下编译GPU Ocelot(其中我是核心贡献者之一) . 我在没有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提供支持!
希望这可以帮助 .
[1]:GPU Ocelot - https://code.google.com/archive/p/gpuocelot/
[2]:Ocelot Interactive Debugger - http://forums.nvidia.com/index.php?showtopic=174820
您还可以检查gpuocelot项目,这是一个真正的模拟器,因为将模拟PTX(转换为CUDA代码的字节码) .
还有一个LLVM转换器,测试它是否比使用-deviceemu时更快是有趣的 .
CUDA工具包内置了一个,直到CUDA 3.0发布周期 . 我使用其中一个非常旧版本的CUDA,确保在使用nvcc编译时使用-deviceemu .
https://github.com/hughperkins/cuda-on-cl允许您在OpenCL 1.2 GPU上运行NVIDIA®CUDA™程序(完全披露:我是作者)
使用-deviceemu进行编程时要小心,因为nvcc在仿真模式下会接受这些操作,但在GPU上实际运行时则不然 . 这主要与设备 - 主机交互有关 .
正如你所提到的,准备一些缓慢的执行 .