c - 在 openMP 中,如何确保线程在继续之前同步?

标签 c openmp benchmarking intel

我正在使用 #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/

相关文章:

c - 为什么我在只读对象中收到错误消息 "assignment of member ‘readdir’”

openmp - 如何使用 OpenMP 并行化代码(对称矩阵)?

performance - Membase 和 Redis 必须存储在磁盘上时

haskell - 对不同大小的输入运行 Haskell 基准测试

c# - 在 C# 上用 union 声明 C 结构

c++ - Ubuntu 13.10 中的 GCC iostream fstream 错误

c - 使用 threads.h 静态初始化 mtx_t

fortran - Fortran 中的 COMMON block 是否必须在 OpenMP 的每个子例程中声明为 threadprivate?

c - OpenMP 中的 threadprivate 错误

c++ - 为什么使用 istreambuf 迭代器读取文件通过重复执行会变得更快?