可以模拟GPU进行CUDA/OpenCL单元测试吗?

13

我想开发一个库,其中包含能够在CPU或GPU上运行的算法。GPU可以是Nvidia(那么算法将使用CUDA)或其他(那么算法将使用OpenCL)。

我想在这个项目中模拟GPU,因为可能:

  • 我将使用不同的计算机来开发软件,其中一些计算机没有GPU。

  • 该软件最终将在可能有GPU或没有GPU的服务器上执行,单元测试必须执行并通过。

是否有办法模拟GPU进行单元测试?

在以下链接中:

GPU Emulator for CUDA programming without the hardware

他们提供了一个解决方案,但仅适用于CUDA,而非OpenCL,并且他们提出的软件"GPUOcelot"不再得到积极维护。


性能在 CPU 上显然会更差,但我需要知道是否有一种方法来测试算法是否正确工作并正确编程,即使没有安装 GPU。在单元测试中,有库可以模拟数据库正在监听,例如 fakemongo https://github.com/fakemongo 模拟 MongoDB 数据库以测试您的 SQL 函数是否正确。 - Rob
可能是无需硬件的CUDA编程GPU模拟器的重复问题。 - José Luis
1
在那个链接中,他们只谈论了CUDA(而不是OpenCL),他们提出的解决方案是一种没有得到积极维护的软件。 - Rob
使用GPUOcelot或其他功能性GPU模拟器进行单元测试可能会存在问题,因为这些模拟器无法完全模拟GPU的并行性。由于这个原因,一些明显不正确的代码和破碎的同步将在模拟器中执行而没有错误。虽然比没有单元测试要好,但肯定比常规单元测试要差。 - Jan Lucas
2个回答

8
这取决于您对仿真的理解。您无法模拟GPU的速度。
GPU在体系结构上与CPU非常不同,具有大量工作线程(1000个、10000个等等),这就是我们使用它的原因。即使在代码并行化时,CPU也只能有几个线程,并且它们还具有不同的指令集。
但是,您可以使用特殊软件(如NVIDIA GPU的NVEmulate和AMD的OpenCL Emulator-Debugger)来模拟执行。
相关问题:没有硬件的CUDA编程GPU仿真器,其中被接受的答案推荐使用gpuocelot进行CUDA仿真。

非常感谢,这正是我在寻找的。我有一台带有GPU的电脑,但有时我更喜欢使用一台没有GPU的旧笔记本电脑在沙发上编码,因此我需要知道代码是否有效。 - Rob
2
@Rob 如果是这样,你可能想看一下 rCUDA。它允许你从没有 GPU 的节点上访问远程 GPU。请参见:http://www.rcuda.net/index.php/what-s-rcuda.html - Rohan Saxena
gpuocelot和NVEmulate似乎不再得到维护。我在这里添加了一个新的问题和答案对,以反映2020年的最新情况,但很可能会被关闭,因为它与主题无关。 - Bruce Adams

0

我不知道最新的技术发展情况,但我可以提供一些有限的东西供参考,这可能会有所帮助。

这个问题的被接受答案已经过时了。在这里,关于在不支持CUDA或OpenCL的机器上编译和运行GPU代码的问题已经出现了多次(但可悲的是,它经常被视为离题)。这个答案也适用于那些问题。

许多答案都涉及到未维护的软件解决方案。似乎只有两个答案经得起时间的考验,将其视为mu question

  • 使用真正的GPU-即如果您还没有一个便宜的cuda卡,就购买一个。
  • 在云中租用别人的GPU

然而模拟器确实存在。

GPU虚拟化也在维基百科页面上得到了很好的覆盖。有强烈的支持,使虚拟机使用主机硬件。

Docker和VirtualBox都支持GPU透传。

模拟的原因

  • 学习并跟上CUDA和OpenCL的变化
  • 估计各种API对性能的影响。
  • 测试您的代码在不同平台上的工作情况。
  • 作为无法访问的硬件的代理(如本问题所述)

模拟的类型

  • 对于测试,只要实现符合标准且可靠,您可能会接受较慢的实现。

  • 对于在不同硬件上运行的生产环境,您更可能接受类似但不完全相同的结构(例如不同的warp大小,不同的高级FFT库等),以及更复杂的性能优化基元实现。您可能要求至少达到与可比硬件相当的Cuda速度的80%。

(感谢https://stackoverflow.com/users/13130048/sebastian提供这两个观点)

对于第二种情况,您可能不仅需要GPU虚拟化,还需要进行额外的优化处理。

为什么模拟器越来越少,难以经受时间的考验?

  • GPU价格逐渐降低,但高性能代价不菲。
  • GPU(更不用提TPUs和FPGAs)正在快速发展。
  • 一些硬件技巧被竞争对手保密,因此模拟实际硬件变得困难。
  • CUDA 和 openCL 标准也在变化,但变化较慢。

可以说,更多了解这些内容的程序员是必要的。编译代码并不会直接运行和测试,这显然是不专业的。因此,在你没有所有可能或有趣的硬件组合物理上可用的情况下,模拟应运而生。

既然如此,令人惊讶的是,许多这些模拟项目都未经得住时间的考验,也未经GPU制造商的认可或提供。

但是,仍有一些活跃的模拟项目存在。

活跃的GPU模拟项目

截至2022年10月,至少有两个活跃的模拟项目在维护中:

我无法确定它们的好坏以及与使用真实GPU(自己的或租用的)相比使用的普遍程度。

荣誉提及

Cuda到OpenCL源代码转换器。这些似乎是维护良好的,但它们本身不是仿真器。

为什么这不是一个解决的问题?

有许多挑战需要克服。我的看法是:

  1. 提供模拟特定版本CUDA或openCL标准的运行时
  2. 提供针对此运行时的编译器(理想情况下为gcc或clang)
  3. 获得供应商的支持(例如Nvidia或kronos group)
  4. 获得社区的支持(即良好的用户群和贡献者集合)
  5. 将支持构建到流行的仿真环境中(例如virtualbox)

你也可以认为,几乎所有从事这个领域的人都可以访问真正的GPU,因此这并不是必要的。

第3点的供应商在点1、2和4方面做得很好。 仿真器必须在此基础上建立自己的思路。 这是一场艰苦的斗争。我希望并相信未来会取得成功。

看看virtualbox,我能找到的最后一次讨论是2011年。

看似已经停止维护的项目

这些项目曾在之前的提问和回答中被提到过。

  • gpuocelot - 不再维护
  • mcuda - 看起来没有维护了
  • cuda-waste - 在早期被冻结的 Google Code 上
  • nvemulate - Nvidia 的 CUDA 模拟器 - 一段时间以前就已经停用了

其他看似已经停止维护的项目:

早期(已过时)问题:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接