2011-04-13 71 views
9

我在带有Xeon处理器的Mac Pro上运行完全并行的矩阵乘法程序。我创建了8个线程(与内核一样多的线程),并且没有共享写入问题(不写入相同的位置)。出于某种原因,我使用pthread_createpthread_join大约是使用#pragma openmp的两倍。为什么POSIX线程比OpenMP慢

有什么都没有其他的区别...相同的编译选项,在这两种情况下相同数目的线程,相同的代码(除了编译/ pthread部分明显)等

而且环路非常大 - 我不是并行化小循环。

(我真的不能张贴代码,因为它是学校工作。)

为什么会这样发生?不OpenMP使用POSIX线程本身?它怎么会更快?

+0

它们是否都使用相同数量的累积CPU时间? – Gabe 2011-04-13 03:45:28

+1

您是否验证过OpenMP与您的手动版本使用相同数量的线程? – Gabe 2011-04-13 03:49:15

+3

如果每个只使用7个线程会发生什么? – Jess 2011-04-13 03:51:08

回答

6

(编辑) 你的主线程在做什么?没有看到你的代码,我猜测主线程实际上几乎没有运行,但仍然在pthread结束时耗尽时钟周期,然后重新开始并继续。每次给定的周期都会暂停/继续其他线程。

在OpenMP中,主线程可能会进入休眠状态,并在并行区域结束时等待唤醒事件。

+1

嗯......这不完全是我的意思哈哈。我的意思是说有更多的线程比内核的数量多,所以他们争夺处理时间。 (这里的管理开销可以忽略不计,因为它绝对不会超过OpenMP *) – Mehrdad 2011-04-13 04:34:36

+2

在OpenMP中,初始线程(或在您的术语中是主线程)在工作共享区域与团队的其他成员一起工作。除非没有进一步的工作要做,否则这些线程都不会进入睡眠状态(然后根据实现情况,线程会在睡眠或旋转等待屏障)。 – ejd 2011-04-13 14:53:47

相关问题