我已经为 CUDA 编写了最小二乘优化程序。当它优化一个数据集时,它工作得很好。为了进一步使用,我必须同时使用三个数据集来实现它。 该代码由三个内核和它们之间的一些主机代码组成,用于准备数据等。 一个简单的实现是为每个数据集调用该程序三次。
但我的任务是找出如何同时运行它 3 次。
当我使用像 openmp 或 posix 这样的库时,是否可以同时从三个主机线程调用程序或并发内核,甚至是一个好主意?还是我应该尝试编写自己的调度程序?
最佳答案
当您说“同时有四个 block ”时,您是指每个多处理器 (MP) 有四个 block 吗?
根据您在 Q 中的附加评论,您的 560 Ti 上可能有 384/32=12 个多处理器 (MP) .如果您为一个内核启动超过 12*4=48 个 block ,您将无法同时运行三个内核。
在这种情况下,您的任务规模对于 concurrent kernel execution 来说太大了,但您仍然可以重叠数据传输和内核执行,如 this blog 所示。 .
您可以在 Asynchronous Concurrent Execution 部分找到更多信息CUDA 编程指南。
另一方面,由于每个数据集都有一些主机代码,因此您可以通过同时运行一个数据集的主机代码和另一个数据集的内核来加速您的程序。
对于主机代码并行性,您可以使用 posix/omp,然后将具有不同 CUDA 流的每个内核绑定(bind)到相应的主机线程。
关于multithreading - 从多线程 c 应用程序调用 cuda 内核,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14474869/