为什么POSIX线程比OpenMP慢

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

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

循环非常大 – 我没有并行化小循环。

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

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

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

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