在 GPU 上启动多个 POSIX C++ 代码副本

Posted

技术标签:

【中文标题】在 GPU 上启动多个 POSIX C++ 代码副本【英文标题】:Launching many copies of POSIX C++ code on GPU 【发布时间】: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 的“标准”代码,只需重新编译即可。可能其他任何事情都需要一定程度的移植(即重构代码)和您的学习。 【参考方案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 指令。虽然在未来有可能,但这远远超出了现代算法知识和计算能力。研究这些努力的科学包括人工智能规划、程序综合、自动定理证明、深度学习。

【讨论】:

以上是关于在 GPU 上启动多个 POSIX C++ 代码副本的主要内容,如果未能解决你的问题,请参考以下文章

GPU技术大会感受--专注显卡解决方案十年,英伟达在人工智能上创造出另外一副天地!

如何在安装驱动程序之前在 C++ 中获取 GPU 信息

opengl 代码是不是在 GPU 上运行?

Linux C++ pthread是什么缩写?(POSIX Threads)<pthread.h>

一个实例有多个 GPU 或多个实例有一个 GPU

c++中的Posix线程