multithreading - 从多线程 c 应用程序调用 cuda 内核

标签 multithreading cuda

我已经为 CUDA 编写了最小二乘优化程序。当它优化一个数据集时,它工作得很好。为了进一步使用,我必须同时使用三个数据集来实现它。 该代码由三个内核和它们之间的一些主机代码组成,用于准备数据等。 一个简单的实现是为每个数据集调用该程序三次。

serial compuatation

但我的任务是找出如何同时运行它 3 次。 multithreaded

当我使用像 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/

相关文章:

multithreading - 用于异步任务的 JMS MDB 或 ScheduledThreadPoolExecutor

CUDA扭曲同步问题

c++ - STL推力多 vector 变换?

java - 使用java从套接字流读取多个流?

c - unix中的线程通信

CUDA - 为傻瓜使用 CURAND 库

eclipse - 如何使用 eclipse Nsight 仅使用一个 GPU 调试 CUDA

c++ - 如何在 CUDA 中从稀疏数组表示变为密集数组表示

java - 确保线程的 "updates"对 Java 中的其他线程可读

java - 线程缺少其他线程的更新