multithreading - C++11 用 clang 替代 OpenMP

标签 multithreading c++11 lambda clang openmp

Clang 尚不支持 OpenMP,但是否可以使用 C++11 实现“​​并行”?

最佳答案

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;
}

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;
}

OpenMP 子句(firstprivate...)可以以相同的方式实现,但它(一点)更多的工作......

关于multithreading - C++11 用 clang 替代 OpenMP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17235053/

相关文章:

c# - ReaderWriterLockSlim 和脉冲/等待

python - 在 Linux 上创建线程与进程的开销

c++ - finally函数依赖RVO

c++ - 在完美转发函数中公开参数类型,避免代码重复

lambda - Java Streams 根据属性对条目进行分组,但收集 Map 中对象的属性

c++ - 如何并行优化大数据操作

c++ - 线程安全、无数据争用、无滞后共享容器 (circular_buffer)

c++ - std::enable_if 在模板类中的同名函数上使用时产生错误

java - 在 Java Lambda 中返回二级列表

java - Runnable Interface 和 Lambda,这是正确的方法之一吗?