【问题标题】:Launching many copies of POSIX C++ code on GPU在 GPU 上启动多个 POSIX C++ 代码副本
【发布时间】:2020-12-21 20:56:09
【问题描述】:

我有一个计算量非常大的单线程 POSIX+boost C++ 程序,我只是在 48 核 CPU 上多次启动它(这是一种蛮力 A* 搜索算法)

是否有任何简单的方法可以重新编译 GPU 代码并在“更多”GPU 内核上运行?

假设我想按原样运行线程,为 GPU 移植现有 boost C++ 代码的最简单方法是什么?

【问题讨论】:

  • 一句话,没有。天下没有免费的午餐……
  • @talonmies 否也是一个答案,对于是否可能,似乎没有明确的答案。谢谢!
  • 据我所知,没有一种方法可以简单地涉及重新编译任意单线程代码,以使其为 GPU 执行做好准备。如果您利用certain emerging C++17 features,则可以编写使用GPU 的“标准”代码,只需重新编译即可。可能其他任何事情都需要一定程度的移植(即重构代码)和您的学习。

标签: linux cuda gpu opencl hpc


【解决方案1】:

是否有任何简单的方法可以重新编译 GPU 代码并在“更多”GPU 内核上运行?

没有

假设我想按原样运行线程,为 GPU 移植现有 boost C++ 代码的最简单方法是什么?

没有。如 cmets 中所述,C++17 包含 parallel algorithms,而 NVIDIA 提供了 C++17 compiler with CUDA support。这距离采用“POSIX C++”代码并直接在 GPU 上运行它还有很长的路要走。我熟悉的任何 GPU 编程范式都没有这样的工作方式。

【讨论】:

    【解决方案2】:

    对于那些对为什么这不可能(而且可能永远不可能)感兴趣的人来说,GPU 有一个非常具体的计算逻辑,通常情况下它的性能会比单线程 CPU 低得多,即使程序以某种方式在多个内核上启动:

    • 在多核 CPU 中,内核尽可能地分开,以便开发人员无需考虑芯片内部。只有少数因素会影响线程性能扩展:例如内存带宽和(在某些情况下)同时的多线程效果。

    • 在 GPU 中,内核是“有意地”紧密连接的:例如,如果不同线程中的分支发生方式不同,那么一组完整的内核(在某些情况下多达一百个)最终会按顺序执行代码,放弃所有并行化的好处。此外,由于内核通常“较慢”,它们的主要优势在于“矢量化”操作,要求开发人员“考虑向量”而不是“数据结构”以获得名义性能。

    因此,虽然有些编程工具包“看起来像 C”,但它们实际上是隐藏在 C 语法和类 C 库调用之后的特定领域语言。

    从普通代码到高度并行的 GPU 代码的“可用”转换需要一种算法,该算法可以将代码作为逻辑加载,在数十亿个基本状态的规模上找到并证明等效逻辑转换的正确性,并将其转换回基于 GPU 计算模型的 GPU 指令。虽然在未来有可能,但这远远超出了现代算法知识和计算能力。研究这些努力的科学包括人工智能规划、程序综合、自动定理证明、深度学习。

    【讨论】:

      猜你喜欢
      • 2018-04-28
      • 2011-05-06
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 2015-11-24
      • 2021-01-18
      相关资源
      最近更新 更多