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
- 1. C++ 11 thread con clang
- 2. clang ++ C++ 11 invocazione
- 3. clang, openMP e CMake
- 4. C++ 11 alternativa pthread_cond_timedwait
- 5. Sostituire BOOST_FOREACH con alternativa "pura" C++ 11?
- 6. Utilizzo di OpenMP con llvm-clang
- 7. Come compilare C++ 11 con clang 3.2 su OSX lion?
- 8. C++ OpenMP con shared_pointer
- 9. Inclusione di intestazioni C++ 11 con Clang/LLVM
- 10. Migliore alternativa per enfatiche con scope - Pre C++ 11
- 11. Clang + OpenMP su Linux utilizza solo 1 core CPU
- 12. Utilizzo di C++ 11 unordered_set in Visual C++ e clang
- 13. C++: alternativa a "std :: is_fundamental"?
- 14. clang ++ compila unico programma C++ 11 utilizzando boost :: formato quando -std = C 11 opzione ++ è sceso
- 15. Xcode 4.5 e OpenMP con Clang (Apple LLVM) utilizza un solo core
- 16. Attivare il supporto per C++ 11 in Clang
- 17. Alternativa a C++ eccezione
- 18. Il supporto per C++ 11 di clang è affidabile?
- 19. migrazione a C++ 11
- 20. È valido C++ 11
- 21. C++ 11 segnaposto con spinta
- 22. Alternativa a __uuidof in C
- 23. Alternativa a Thread.Sleep in C#?
- 24. Utilizzo di OpenMP con C++ 11 basato su loop per loop?
- 25. C++ OpenMP programma
- 26. utilizzando C++ 11 con il progetto GYP
- 27. Nessuna corrispondenza con C++ 11 regex
- 28. Ultimi C++ 11 funzioni con Android NDK
- 29. Come specificare C++ 11 con distutils?
- 30. Come aggiornare a C++ 11?
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