C 为什么POSIX线程比OpenMP慢

C 为什么POSIX线程比OpenMP慢,c,pthreads,openmp,C,Pthreads,Openmp,我正在Mac Pro上用Xeon处理器运行一个完全并行的矩阵乘法程序。我创建了8个线程(与内核一样多的线程),并且没有共享写入问题(没有写入相同的位置)。出于某种原因,我使用pthread\u create和pthread\u join的速度大约是使用#pragma openmp的两倍 在任何事情上都没有其他区别。。。相同的编译选项,两种情况下相同的线程数,相同的代码(除了pragma/pthread部分),等等 这些循环非常大——我不会将小循环并行化 (我不能发布代码,因为这是学校作业。) 为

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

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

这些循环非常大——我不会将小循环并行化

(我不能发布代码,因为这是学校作业。)

为什么会发生这种情况?OpenMP本身不使用POSIX线程吗?怎样才能更快呢?

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


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

它们是否都使用相同的累积CPU时间?您是否验证过OpenMP使用的线程数与手动版本相同?如果每个线程上只使用7个线程会发生什么情况?@Jess:问得好!!我试过了,速度更快。。。原来我创建了8个线程,但我已经有了一个主线程,总共9个,比内核的数量多了一个!(哇,哈哈…)请随便回答,我会接受的。:)嗯。。。我不是这个意思,哈哈。我的意思是,有一个线程比核心的数量多,所以他们在竞争处理时间。(这里的管理开销可以忽略不计,因为它肯定不超过OpenMP的开销。)在OpenMP中,初始线程(或者用您的术语来说,主线程)与团队的其他成员在工作共享区域中协同工作。除非没有进一步的工作要做,否则所有线程都不会睡眠(然后线程要么睡眠,要么在屏障处旋转等待,具体取决于实现)。