我想创建一个并行处理CUDA / C ++应用程序,它同时执行许多功能操作。我希望能够在CUDA中创建一个线程,作为分配任务的中心,并创建将要进行并行数学计算的时间(如果可能的话)。 CUDA库是否支持此功能?
编辑以澄清:我想要充当集线器的线程将在主机CPU上创建,并且它创建和管理的任务将在GPU设备上创建。我相信CPU可以按顺序检查数千个期货的价值,并在完成时为它们分配新任务。如果可能,答案可以参考或创建一个具体的例子,说明我将如何做到这一点。
答案 0 :(得分:1)
在重新阅读您的问题时,您似乎在询问是否可以在GPU上完成此操作。是的它可以,但有一些非常严格的限制。 CUDA harware支持原子比较和交换。文献中有一些例子可以使用这个和其他原子指令来实现锁和条件变量,以及无锁数据结构。一些阅读让你入门:
底线是:你必须推出自己的期货实施。此外,任何等待的线程都必须旋转等待,因为没有主机端屈服的模拟。
我原来的回答,理解是你在主持方面询问CUDA对期货的支持:
是。最新版本的CUDA支持C ++ 11和CUDA已经支持多个主机线程一段时间了。因此,您可以使用std::async
包装CUDA内核调用。
您可能需要考虑的一个方面是CUDA将为访问CUDA函数的每个线程创建线程本地上下文。根据您的C ++库中std::async
的实现情况,如果您最终为每个std::async
调用创建新的上下文,则可能会产生严重的开销。
最后,CUDA调用已经是异步的,即您可以在GPU忙时继续处理主机线程上的内容。流水线内核调用有时会带来好处。您还可以使用CUDA事件API来协调单个线程中的多个异步CUDA活动。从某种意义上说,CUDA实现已经在做std::future
提出的建议。我建议首先说服自己在冒险进入多线程领域之前无法使用单个主机线程进行管理,这有时会带来许多与非CUDA相关的问题。希望有所帮助。
答案 1 :(得分:0)
此链接可以帮助您直接参考NVidia的CUDA Toolkit API文档。注意:他们的网站地址可能会有所变化。
在阅读了一些文档之后,看来CUDA是通过自己的机器架构以及自己的CUDA环境和编译器设计用于多线程和并行编程的。由于大量的数据处理,特别是图像,图形,视频处理,现代GPU专门为此目的而设计,因此很容易得出结论,这是在CUDA设备架构内的幕后完成的。
在阅读有关支持C ++语言的规范时,它们确实包括对大多数语言的支持,但其中一些可能仅限于主机,而不能用于设备或内核代码,这些代码分别定义为{ {1}}。我目前对CUDA并不熟悉,但这是我通过阅读上面链接中提供的API文档而收集到的。
你问过这个:
我想创建一个并行处理CUDA / C ++应用程序,它同时执行许多功能操作。我希望能够在CUDA中创建一个线程,作为分配任务的中心,并创建将要进行并行数学计算的时间(如果可能的话)。 CUDA库是否支持此功能?
为了回答你的问题,我认为架构的设计本身就说明了问题,你可以分解代码来处理多个块中的多个线程到网格。并行和多线程是GPU与其API和编译器一起设计的核心。然而,我唯一无法找到任何信息的是使用期货或承诺。因此,它可能取决于您的项目的总体设计方法,以实现这一点。我确信你能够在主机端创建一个封装你的设备线程的对象,并管理期货和承诺的同步和并发,但是为了在设备或内核方面实现这些,我无法从他们的文件中找到任何直接的答案或陈述,以这种或那种方式说出来。因此,除了考虑您使用c ++期货的请求之外,您询问CUDA库或API是否支持您想要做的事情,因为我不得不说它已经完成了设计。