加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – omp订单条款如何工作?

发布时间:2020-12-16 05:55:31 所属栏目:百科 来源:网络整理
导读:vectorint v;#pragma omp parallel for ordered schedule(dynamic,anyChunkSizeGreaterThan1) for (int i = 0; i n; ++i){ ... ... ...#pragma omp ordered v.push_back(i); } 这填充v与n大小的有序列表. 当达到omp有序块时,所有线程都需要等待最小迭代可能
vector<int> v;

#pragma omp parallel for ordered schedule(dynamic,anyChunkSizeGreaterThan1)
    for (int i = 0; i < n; ++i){
            ...
            ...
            ...
#pragma omp ordered
            v.push_back(i);
    }

这填充v与n大小的有序列表.

当达到omp有序块时,所有线程都需要等待最小迭代可能的线程完成,但是如果没有任何线程被指定为特定的迭代呢?或者OpenMP运行时库总是确保最低的迭代由一些线程处理?

另外为什么建议使用ordered子句与动态调度表一起使用?静态时间表会影响性能吗?

解决方法

ordered子句的工作原理如下:不同的线程并发执行,直到它们遇到有序的区域,然后按顺序执行它们将在串行循环中执行的顺序.这仍然允许一定程度的并发性,特别是如果有序区域之外的代码段具有大量的运行时间.

没有特别的理由使用动态调度,而不是具有小块大小的静态调度.这一切都取决于代码的结构.由于有序引入线程之间的依赖关系,如果与默认块大小的schedule(静态)一起使用,则第二个线程必须等待第一个线程完成所有迭代,然后第三个线程必须等待第二个线程完成它的迭代(因此也是第一个),等等.可以用3个线程和9个迭代(3个每个线程)轻松地可视化它:

tid  List of     Timeline
     iterations
0    0,1,2       ==o==o==o
1    3,4,5       ==.......o==o==o
2    6,7,8       ==..............o==o==o

=表示线程正在并行执行代码.当线程正在执行有序区域时. .是线程空闲,等待轮到执行有序区域.随着计划(静态,1)将发生以下情况:

tid  List of     Timeline
     iterations
0    0,3,6       ==o==o==o
1    1,7       ==.o==o==o
2    2,5,8       ==..o==o==o

我相信这两种情况的差异都是显而易见的.随着时间表(动态),上面的图片将变得或多或少随机,因为分配给每个线程的迭代列表是非确定性的.它还会增加额外的开销.仅当每次迭代的计算量不同时才需要花费更多的时间进行计算,而不是使用动态调度的额外开销.

不要担心最小的迭代次数.它通常被处理到团队中的第一个线程以便准备执行代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读