无需硬件即可进行 CUDA 编程的 GPU 模拟器 [关闭]

Posted

技术标签:

【中文标题】无需硬件即可进行 CUDA 编程的 GPU 模拟器 [关闭]【英文标题】:GPU Emulator for CUDA programming without the hardware [closed] 【发布时间】:2011-03-06 11:12:29 【问题描述】:

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


信息:

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

我在 Ubuntu 10.04 LTS 上编程。

【问题讨论】:

相关:AMD GPU:***.com/questions/12828268/…,英特尔集成显卡:***.com/questions/8193242/can-i-run-cuda-on-intel 【参考方案1】:

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

模拟器尝试忠实地实现 PTX 1.4 和 PTX 2.1 规范,其中可能包含旧版 GPU 不支持的功能。 LLVM 转换器致力于从 PTX 到 x86 的正确和高效转换,这有望使 CUDA 成为编程多核 CPU 和 GPU 的有效方法。 -deviceemu 已经成为 CUDA 的一个弃用功能有一段时间了,但 LLVM 翻译器一直更快。

此外,模拟器中内置了几个正确性检查器来验证:对齐的内存访问,对共享内存的访问是否正确同步,以及全局内存取消引用访问分配的内存区域。我们还实现了一个command-line interactive debugger,主要受 gdb 启发,可以单步执行 CUDA 内核、设置断点和观察点等……这些工具是专门为加快 CUDA 程序的调试而开发的;您可能会发现它们很有用。

对于仅限 Linux 方面的问题,我们深表歉意。我们已经启动了一个 Windows 分支(以及一个 Mac OS X 端口),但工程负担已经大到足以强调我们的研究追求。如果有人有时间和兴趣,不妨帮助我们提供对 Windows 的支持!

希望这会有所帮助。

[1]:GPU Ocelot - https://code.google.com/archive/p/gpuocelot/ [2]:Ocelot 交互式调试器 - http://forums.nvidia.com/index.php?showtopic=174820

【讨论】:

嗨 - 你还在吗?是否有关于如何在现有的 CUDA 构建环境中使用 Ocelot 构建程序的文档?另外,Ocelot 可以与 Thrust 一起使用吗? 更多最新的GPU Ocelot源代码可以通过GitHubgtcasl/gpuocelot找到。【参考方案2】:

对于那些在 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;
    
    

    请注意,在 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".
    

    我在 Internet 上发现,如果我使用 gcc-4.2 或类似古老的而不是 gcc-4.9.2,错误可能会消失。我放弃了。


    gpuocelot

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

    以下是一些最新的网站:

    GitHub; Project's website; Installation guide。

    我尝试在the guide 之后安装 gpuocelot。我在安装过程中遇到了几个错误,我又放弃了。 gpuocelot 不再受支持,它依赖于一组非常具体的库和软件版本。

    您可以尝试从 2015 年 7 月开始关注 this tutorial,但我不保证它会起作用。我没有测试过。


    MCUDA

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

    它可能有用。这里是a link to the website。


    CUDA 废物

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

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


    CU2CL

    最后更新:12.03.2017

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

    链接:

    CU2CL homepage CU2CL GitHub repository

【讨论】:

太可惜了!由于不提供慢速路径,因此很难在任何机器上构建和测试应用程序。这意味着,开发人员应避免向 Cuda 添加依赖项。它仍然可供业余爱好者和研究人员用于一次性项目。不适用于客户的实际应用。 CU2CL 好像很活跃,也值得一看。 1. nvcc -deviceemu 4.得到CUDA Waste 工作 5.得到CU2CL 工作【参考方案3】:

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

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

【讨论】:

可悲的是,这仅适用于 linux。其中,默认情况下我是 linux 用户。我做的少量开发是在 Windows 机器上进行的。 -deviceemu 已被弃用,因此 jskaggz 的答案不太合适。总的来说,这似乎是最好的答案。【参考方案4】:

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

【讨论】:

CUDA 模拟器已被弃用,你最好看看 gpuocelot。 Plus CUDA 模拟器每个逻辑 CUDA 线程使用一个本机操作系统线程,这非常低效。【参考方案5】:

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

【讨论】:

我也可以在 CPU 上运行它吗? 仅限 GPU。需要 OpenCL 1.2 GPU 或更高版本。 您可能可以在 CPU 上运行它,使用 jrprice.com/Oclgrind ,但我想这可能不是您的意思 ;-) 。我猜 Coriander(新名称)可能也可以在 CPU OpenCL 上运行,但我从未对此进行过测试。可能需要一点刺激。【参考方案6】:

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

正如你所说,为一些缓慢的执行做好准备。

【讨论】:

【参考方案7】:

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

【讨论】:

以上是关于无需硬件即可进行 CUDA 编程的 GPU 模拟器 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

CUDA编程 基础与实践 樊哲勇 电子书 pdf

Cuda架构,调度与编程杂谈

[人工智能-深度学习-38]:英伟达GPU CUDA 编程框架简介

CUDA编程 C++指引

一文了解GPU并行计算CUDA

CUDA编程GPU内存总结