C++ 11替代OpenMP with clang

use*_*888 12 lambda multithreading openmp clang c++11

Clang不支持OpenMP(但是)是否可以用C++ 11实现"并行"?

use*_*888 7

OpenMP版本:

// parallelfor_gcc.cpp
// g++ -O2 -Wall -std=c++11 -fopenmp parallelfor_gcc.cpp
#include <cmath>
#include <vector>
int main() {
  unsigned int size = 1e8;
  std::vector<double> vect(size);
#pragma omp parallel for
  for (unsigned int i=0; i<size; i++) {
    vect[i] = sin(2*M_PI*i/(double)size);
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

C++ 11版本:

// parallelfor_clang.cpp
// clang++ -O4 -Wall -std=c++11 -lpthread parallelfor_clang.cpp
#include <cmath>
#include <thread>
#include <vector>
void parallelFor(const unsigned int size, 
                 std::function<void(const unsigned int)> func) {
  const unsigned int nbThreads = std::thread::hardware_concurrency();
  std::vector < std::thread > threads;
  for (unsigned int idThread = 0; idThread < nbThreads; idThread++) {
    auto threadFunc = [=, &threads]() {
      for (unsigned int i=idThread; i<size; i+=nbThreads) {
        func(i);
      }
    };
    threads.push_back(std::thread(threadFunc));
  }
  for (auto & t : threads) t.join();
}
int main() {
  unsigned int size = 1e8;
  std::vector<double> vect(size);
  auto myFunc = [=, &vect](unsigned int i){
    vect[i] = sin(2*M_PI*i/(double)size);
  };
  parallelFor(size, myFunc);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

OpenMP子句(firstprivate ...)可以用同样的方式实现,但是(稍微)更多的工作......

  • 只是说,虽然这是一个很好的例子,它可以在C++ 11中完成,但它有许多缺点.在OpenMP中,线程不会在计算后立即连接,如示例中所示.在一个更详细的示例中,这将在C++ 11版本中增加显着的开销,除非"线程"向量被重新处理以处理不同的作业,从而使代码更不易读. (2认同)