Openmp线程分歧?

时间:2012-04-20 16:16:47

标签: multithreading cuda openmp

术语线程分歧用于CUDA;根据我的理解,这是一种情况,其中分配了不同的线程来执行不同的任务,这导致了巨大的性能损失。

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

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

4 个答案:

答案 0 :(得分:7)

不,使用OpenMP的分歧线程没有性能损失。这是CUDA中的一个问题,因为指令同时广播到一组核心的方式。当一个OpenMP线程以CPU内核为目标时,每个CPU内核都有自己独立的指令集,它就像任何其他单线程程序一样运行。

如果您在线程分歧后遇到同步障碍,您可能会发现某些核心未被充分利用,因为这会迫使更快的线程等待较慢的线程赶上。

答案 1 :(得分:3)

在谈到CPU并行性时,使用某种线程设计模式并没有内在的性能损失。至少不在理论水平。

我看到的唯一问题是,由于线程正在执行可能具有不同完成时间的不同事物,因此一些线程在完成工作后可能处于闲置状态,等待其他线程完成更长的任务。

答案 2 :(得分:1)

CUDA中的术语线程分歧指的是当并非所有bock的线程都以相同的结果评估条件时的情况。据说这种线程有分歧。如果不同的线程处于相同的warp中,那么这些线程可能会连续执行工作,从而导致性能下降。

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

答案 3 :(得分:1)

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