[关闭]
@snuffles 2019-09-04T11:39:17.000000Z 字数 2271 阅读 1436

openMP总结

roborock


OpenMp是什么

如何开启

在编译选项里加-fopenmp
或者find openmp target link libraries
头文件中加include "omp.h"

pragma omp parallel for

并行执行相同代码段
自动将下面的for循环分成N份,(N为电脑CPU核数),然后把每份指派给一个核去执行,而且多核之间为并行执行。

如果迭代器是unordered map
那么终止条件 it != map.end()是不明确的,
因为unordered map的空间不是连续的,不能明确的把for循环分为几个线程来做,所以应该通过吧unordered map的索引提前存储在连续空间中,再利用openmp加速

  1. std::vector<std::shared_ptr<Edge>> edges;
  2. edges.reserve(edges_.size());
  3. //for (auto &edge: edges_) //原有的循环
  4. //把索引存起来
  5. for(const auto edge: edges_){
  6. edges.emplace_back((edge.second));
  7. }
  8. //并行
  9. #pragma omp parallel for num_threads(4)
  10. //整体分成四份,不会过于细碎的并行
  11. for(auto block = 0; block < 4 ; ++block) {
  12. //可控的并行循环
  13. for (auto it = edges.begin() + block; it < edges.end(); it += 4)
  14. {

控制并行的线程数量

for num_threads(4)

竞态条件(race condition)

保护并行的数据

  1. #pragma omp parallel for reduction(+:sum) //归约
  2. #pragma omp critical //线程内互斥的代码段

reduction

reduction很方便,但它支持一些基本操作,比如+,-,*,&,|,&&,||等。

critical

有些情况下,我们既要避免race condition,但涉及到的操作又超出了reduction的能力范围。
这就要用到openMP的另一个工具,critical。
执行到critical里面时,要注意有没有其他线程正在里面执行,如果有的话,要等其他线程执行完再进去执行。这样就避免了race condition问题,但显而易见,它的执行速度会变低,因为可能存在线程等待的情况。

ref
omp官网
https://blog.csdn.net/billbliss/article/details/44131591openmp 快速入门 常用技巧 parallel for sections reduction critical
OpenMP 入门教程https://www.cnblogs.com/ospider/p/5265975.html

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注