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

Launching many copies of POSIX C++ code on GPU

我有一个非常计算密集型的单线程 POSIX+boost C++ 程序,我刚刚在 48 核 CPU 上启动了很多副本(这是一种蛮力 A*搜索算法)

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

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

Is there any easy way of recompiling the code for GPU and running on "many more" GPU cores?

没有

What is the easiest way to port existing boost C++ code for GPU assuming I want to run the threads as-is?

没有一个。如评论中所述,C++17 包括 parallel algorithms, and NVIDIA ship a C++17 compiler with CUDA support。这与直接在 GPU 上获取“POSIX C++”代码和 运行 代码相去甚远。没有我熟悉的GPU编程范式那样工作。

对于为什么这不可能(并且可能永远不可能)感兴趣的人来说,GPU 具有非常特定的计算逻辑,在一般情况下会产生比 single-threaded CPU,即使程序以某种方式在多个内核上启动:

  • 在multi-coreCPU中,内核尽可能地分开,这样开发者就不用考虑芯片内部了。只有少数因素会影响线程性能扩展:例如内存带宽和(在某些情况下)同时 multi-threading 效果。

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

因此,尽管存在“看起来像 C”的编程工具包,但它们实际上是 domain-specific 隐藏在 C 语法和 C-like 库调用之后的语言。

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