我正在使用 #pragma omp barrier 来确保我的所有并行线程在继续之前在同一点相遇(没有花哨的条件分支代码,只是直接循环),但我猜测 barrier pragma 实际上并不能保证同步性,只是完成,因为这些是我得到的结果:
0: func() size: 64 Time: 0.000414 Start: 1522116688.801262 End: 1522116688.801676
1: func() size: 64 Time: 0.000828 Start: 1522116688.801263 End: 1522116688.802091
线程 0 的启动速度比线程 1 快大约 1 微秒,因此它的完成时间为 0.414 毫秒,这有点不切实际,顺便说一下,在单核/线程运行中,运行时间平均约为 0.800 毫秒。 (请原谅我的单位关闭,已经晚了)。
我的问题是:有没有办法确保在 openMP 中所有线程都同时启动?或者我是否必须引入另一个库(如 pthread)才能拥有此功能?
最佳答案
barrier
与其他语言一样,OpenMP 中的语句可确保在所有线程到达屏障之前线程不会继续。
它没有指定线程再次开始执行的顺序。据我所知,手动调度线程在 OpenMP 或 Pthread 库中是不可能的(见下面的评论)。
关于c - 在 openMP 中,如何确保线程在继续之前同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49503496/