CUDA 是否提供类似未来的功能
Does CUDA offer future-like functionality?
我想创建一个并行处理 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 是否支持您想要做的事情,对于其他所有内容,我不得不说它已经在设计上做到了。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 在Linux中哪里可以找到互斥、未来等的源代码
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 文件系统:复制功能的速度秘诀是什么
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 如何在Directwrite中获得给定字体的可用OpenType功能
- 对可变参数使用声明.如何选择正确的功能
- CUDA 是否提供类似未来的功能