CUDA 是否提供类似未来的功能?

Does CUDA offer future-like functionality?

我想创建一个并行处理 CUDA/C++ 应用程序,它可以同时执行许多功能操作。我希望能够在 CUDA 中创建一个线程,作为分配任务的中心,并创建未来(如果可能的话),并行地进行耗时的数学计算。 CUDA 库支持吗?

编辑澄清:我想充当集线器的线程将在主机上创建 CPU,它创建和管理的任务将在 GPU 设备上创建。我相信 CPU 可以按顺序检查数千个 futures 的值,并在它们完成时分配新任务。如果可能的话,能否请参考答案或创建一个具体示例来说明我将如何做到这一点。

在重新阅读您的问题时,您似乎在问这是否可以在 GPU 上完成。是的,它可以,但有一些非常严格的限制。 CUDA 硬件支持原子比较和交换。文献中有使用此指令和其他原子指令来实现锁和条件变量以及无锁数据结构的示例。一些入门读物:

底线是:您必须推出自己的期货实施。此外,任何等待线程都必须自旋等待,因为没有主机端让步的模拟。

我的原始答案,根据您询问的有关 CUDA 主机端期货支持的理解:

是的。最新版本的 CUDA 支持 C++11,并且 CUDA 支持多个主机线程已有一段时间了。所以你可以用 std::async.

包装一个 CUDA 内核调用

您可能要考虑的一个方面是,CUDA 将为访问 CUDA 函数的每个线程创建一个线程局部上下文。根据 C++ 库中 std::async 的实现,如果您最终为每个 std::async 调用创建一个新的上下文,您可能会产生严重的开销。

最后,CUDA 调用已经是异步的,即您可以在 GPU 忙碌时继续在主机线程上处理事情。流水线化内核调用有时会有好处。您还可以使用 CUDA 事件 API 来协调单个线程内的多个异步 CUDA 活动。从某种意义上说,CUDA 实现已经在做你可能用 std::future 提出的建议。我建议首先说服自己在进入多线程领域之前无法使用单个主机线程进行管理,这有时会带来许多与 CUDA 无关的问题。希望对您有所帮助。

此 link 应该可以帮助您直接参考 NVidia 的 CUDA 工具包 API 文档。注意:他们的网站地址可能会更改。

CUDA Toolkit Documentation

阅读一些文档后发现,CUDA 是为多线程和并行编程而设计的,它有自己的机器架构以及自己的 CUDA 环境和编译器。由于现代 GPU 是专门为此目的设计的,因为它需要处理大量数据,特别是图像、图形和视频处理,因此很容易得出结论,这是在 CUDA 设备架构的幕后完成的。

在阅读他们关于支持 C++ 语言的规范时,他们确实包括对大多数语言的支持,但其中一些可能仅限于主机,不适用于分别定义这些语言的设备或内核代码作为 __host__ __device__ __global__。我目前对 CUDA 不是很熟悉,但这是我通过阅读我在上面 link 中作为参考提供的 API 文档能够收集到的内容。

你问过这个:

I want to create a parallel procession CUDA/C++ application that does many functional operations concurrently. I want to be able to create a thread in CUDA that acts as the hub for assigning tasks and creates futures(if at all possible) that will do time consuming mathematical calculations in parallel. Does the CUDA library support this?

为了回答您的问题,我认为体系结构的设计不言而喻,您可以在其中分解代码以在多个块内的多个线程上工作到一个网格。并行和多线程是其 GPU 及其 API 和编译器设计方式的核心。但是,我唯一无法找到任何信息的是期货或承诺的使用。所以这可能取决于你的项目的整体设计方法,你将如何实现它。我确定您可以在主机端创建一个对象来封装您的设备线程并管理期货和承诺的同步和并发,但是关于在设备或内核端实现这些我无法从他们的文档中找到任何直接的答案或陈述以某种方式说。因此,除了考虑您使用 c++ 期货的请求外,您还询问 CUDA 库或 API 是否支持您想要做的事情,对于其他一切我不得不说它已经通过设计做到了。