Clang non supporta OpenMP (ancora) ma è possibile implementare un "parallelo per" con C++ 11? VersioneC++ 11 alternativa a OpenMP con clang
risposta
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 Versione:
// 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;
}
clausole OpenMP (firstprivate ...) può essere implementata nello stesso modo, ma è (un po ') più di lavoro ...
Solo per dire che, mentre questo è un buon esempio che può essere fatto in C++ 11, ha più svantaggi. In OpenMP, i thread non vengono uniti immediatamente dopo il calcolo, come nell'esempio. In un esempio più dettagliato, ciò aggiungerebbe un sovraccarico significativo nella versione C++ 11, a meno che il vettore "discussioni" non venga rielaborato per gestire lavori diversi, rendendo così il codice ancora meno leggibile. – xryl669
@ xryl669 Raccomando questa libreria per quel lavoro, mantiene il codice leggibile ed è facile da usare. https://code.google.com/p/threadpool11/ – Etherealone
Mi sembra che il lambda stia catturando il vettore 'threads', perché? – remram
Questo sarebbe più adatto per codereview.stackexchange.com. Votazione per la migrazione. –
Il supporto per openmp in Clang è in fase di revisione. Attualmente è supportata la versione 3.1 e la versione 4.0 è in fase di sviluppo. – xryl669
clang 3.4 plus OpenMP è disponibile all'indirizzo http://clang-omp.github.io/ – mabraham