我在带有Xeon处理器的Mac Pro上运行完全并行的矩阵乘法程序。我创建了8个线程(与核心一样多的线程),并且没有共享写入问题(没有写入相同的位置)。出于某种原因,我对pthread_create
和pthread_join
的使用速度大约是使用#pragma openmp
的两倍。
在任何事情上都没有其他差异......相同的编译选项,两种情况下相同的线程数,相同的代码(显然除了pragma / pthread
部分)等等。
循环非常大 - 我没有并行化小循环。
(我不能真正发布代码,因为这是学校的工作。)
为什么会发生这种情况? OpenMP不使用POSIX线程吗?怎么会更快?
答案 0 :(得分:6)
(编辑)的 你主要做的是什么?在没有看到你的代码的情况下,我猜测主线程实际上几乎没有运行,但是当pthreads完成时仍然在吃掉时钟周期,然后它再次启动并继续。每次给定的周期都有暂停/继续其他线程的开销。
在OpenMP中,主线程可能会进入休眠状态,并在并行区域完成时等待唤醒事件。