C++11 alternative to OpenMP with clang
OpenMP version :
// 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 version:
// 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 clauses (firstprivate...) can be implemented in the same way but it's (a little) more work...