5

CUDA 中使用了术语线程发散;据我了解,这是一种分配不同线程来执行不同任务的情况,这会导致性能受到很大影响。

我想知道,在openmp中这样做会不会有类似的惩罚?例如,假设我有一个 6 核处理器和一个有 6 个线程的程序。如果我有一个条件让 3 个线程执行某个任务,然后让其他三个线程执行完全不同的任务,会不会对性能造成很大影响?我想本质上它有点像使用openmp来做MIMD。

基本上,我正在用 openmp 和 CUDA 编写程序。我希望两个线程运行 CUDA 内核,而其他剩余线程运行 C 代码。谢谢。

4

4 回答 4

7

不,使用 OpenMP 的发散线程不会影响性能。这是 CUDA 中的一个问题,因为指令同时广播到一组内核的方式。当 OpenMP 线程以 CPU 内核为目标时,每个 CPU 内核都有自己独立的一组指令要遵循,并且它的运行方式与任何其他单线程程序一样。

如果您在线程分歧后有同步障碍,您可能会看到您的一些内核未被充分利用,因为这将迫使较快的线程等待较慢的线程赶上来。

于 2012-04-20T16:26:54.103 回答
3

在谈到 CPU 并行性时,使用某种线程设计模式并不会影响内在的性能。至少在理论上不是。

我看到的唯一问题是,由于线程正在做不同的事情,可能有不同的完成时间,一些线程在完成工作后可能会闲置,等待其他线程完成更长的任务。

于 2012-04-20T16:27:16.330 回答
1

openmp 没有这种问题,因为每个 openmp 线程都有自己的 PC。

于 2012-04-30T13:40:12.833 回答
1

CUDA 中的术语线程发散是指不是一个块的所有线程都评估具有相同结果的条件的情况。据说这样的线程是发散的。如果发散线程在同一个扭曲中,那么这些线程可能会连续执行工作,从而导致性能损失。

不过,我不确定 OpenMP 是否有同样的问题。当不同的线程执行不同的工作时,运行时可能会使用负载平衡,但这并不一定会导致工作序列化。

于 2012-04-23T04:58:00.407 回答