2012-04-20 83 views
5

CUDA中使用术语线程发散;根据我的理解,这是一种情况,不同的线程被分配来完成不同的任务,这会导致很大的性能下降。Openmp线程分歧?

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

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

+0

只是好奇,在OpenMP中如何去做这件事?我知道你已经回答了你的问题,但很高兴看到一段代码。 – 2012-04-20 22:37:42

+0

这是题外话题,但是在你让主机代码过于复杂之前,你可能不需要多于一个CUDA的CPU线程 - 使用CUDA 4.0和更高版本的多GPU编程可以从一个主机线程完成,所以除非你在主机方面有同样的工作,多个线程可能不会增加任何东西,但复杂性。如果您在CPU上执行并行工作,则可以使用一个CPU线程用于CUDA,其余用于CPU并行工作。 – harrism 2012-04-23 04:49:08

回答

7

不,对于使用OpenMP的分歧线程没有性能影响。这是CUDA中的问题,因为指令可以同时广播到一组内核。当一个OpenMP线程针对一个CPU内核时,每个CPU内核都有自己独立的一组指令可供使用,并且它像任何其他单线程程序一样运行。

您可能会看到你的一些核心的利用不足,如果你有以下线程发散同步的障碍,因为这将迫使更快线程等待较慢的线程赶上。

+0

感谢您的回应!在堆栈溢出的第一篇文章,我在10分钟内得到两个答复。太棒了。 – Justin 2012-04-20 16:39:19

3

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

我看到的唯一问题是,由于线程都在做这可能完成不同的时间,不同的东西,一些线程可能在完成自己的工作,等待别人来完成一个更长的任务后,处于闲置状态。

+0

感谢您的回应。 – Justin 2012-04-20 16:40:10

1

在CUDA术语线程发散是指当不博克的所有线程评估相同结果的条件的情况。据说这样的线程是分歧的。如果发散的线程处于相同的扭曲状态,那么这些线程可能会串行执行工作,从而导致性能损失。

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

1

没有这样的问题,OpenMP的,因为每一个OpenMP的线程都有自己的PC。