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

Does CUDA offer future-like functionality?

本文关键字:未来 功能 是否 CUDA      更新时间:2023-10-16

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

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

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

  • http://arxiv.org/abs/1110.4623v1
  • http://www.cse.chalmers.se/~bapic/lic_thesis_bapi.pdf
  • http://arxiv.org/pdf/1302.2757.pdf
  • https://www.researchgate.net/publication/275603769_Toward_Concurrent_Lock-Free_Queues_on_GPUs

底线是:你必须自己实施期货。 此外,任何等待线程都必须旋转等待,因为没有主机端屈服的模拟。

我最初的回答,理解您询问的是 CUDA 对主机方期货的支持:

是的。最新版本的 CUDA 支持 C++11 和 CUDA 支持多个主机线程已有一段时间了。 因此,您可以使用 std::async 包装 CUDA 内核调用。

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

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

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

CUDA 工具包文档

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

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

你问过这个:

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

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