为什么POSIX线程比OpenMP慢

Meh*_*dad 9 c pthreads openmp

我在带有Xeon处理器的Mac Pro上运行完全并行的矩阵乘法程序.我创建了8个线程(与核心一样多的线程),并且没有共享写入问题(没有写入相同的位置).出于某种原因,我使用pthread_create和使用的pthread_join速度大约是使用速度的两倍#pragma openmp.

在任何事情上没有其他差异......相同的编译选项,两种情况下相同的线程数,相同的代码(pthread显然除了pragma/部分)等.

循环非常大 - 我没有并行化小循环.

(我不能真正发布代码,因为它是学校的工作.)

为什么会发生这种情况?OpenMP不使用POSIX线程吗?怎么会更快?

Jes*_*ess 6

(编辑)你的主要线程是做什么的?在没有看到你的代码的情况下,我猜测主线程实际上几乎没有运行,但是当pthreads完成时仍然会耗尽时钟周期,然后它再次启动并继续.每次给定周期都有暂停/继续其他线程的开销.

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

  • 在OpenMP中,初始线程(或在您的术语中是主线程)与工作共享区域中的其他团队一起工作.除非没有进一步的工作要做,否则所有线程都不会休眠(然后线程根据实现方式在屏障处休眠或旋转等待). (2认同)