Clang unterstützt OpenMP (noch) nicht, aber ist es möglich, eine "Parallel für" mit C++ 11 zu implementieren?C++ 11 Alternative zu OpenMP mit clang
Antwort
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-Klauseln (firstprivate ...) können auf die gleiche Art und Weise implementiert werden, aber es ist (ein wenig) mehr Arbeit ...
Nur um zu sagen, dass, obwohl dies ein gutes Beispiel dafür ist, dass es in C++ 11 gemacht werden kann, es mehrere Nachteile hat. In OpenMP werden Threads nicht sofort nach der Berechnung verbunden, wie im Beispiel. In einem detaillierteren Beispiel würde dies einen signifikanten Overhead in der C++ 11-Version hinzufügen, es sei denn, der "threads" -Vektor wird überarbeitet, um verschiedene Jobs zu behandeln, wodurch der Code noch weniger lesbar wird. – xryl669
@ xryl669 Ich empfehle diese Bibliothek für diesen Job, es hält den Code lesbar und es ist einfach zu bedienen. https://code.google.com/p/threadpool11/ – Etherealone
Es sieht für mich aus, dass das Lambda den 'threads' Vektor fängt, warum ist das? – remram
- 1. C++ 11 Threads mit clang
- 2. clang, openMP und CMake
- 3. Alternative zu -pg mit Clang?
- 4. Inklusive C++ 11 Header mit Clang/LLVM
- 5. Kompilieren von C-Code mit openmp mit clang-cl
- 6. Verwenden von OpenMP mit llvm-clang
- 7. Clang 3.1 und C++ 11 Unterstützungsstatus
- 8. Mit Clang der Scan-Aufbau mit scons und C++ 11
- 9. Clang/GCC Plugin um benutzerdefinierte C++ 11 Attribute zu interpretieren
- 10. Verwenden von OpenMP mit C++ 11 bereichsbasierten for-Schleifen?
- 11. Warum verbietet Apple clang 11 C++ 11 thread_local, wenn 'offizielle' clang es unterstützt
- 12. Xcode 4.5 und OpenMP mit Clang (Apple-LLVM) verwendet nur einen Kern
- 13. Clang + OpenMP auf Linux verwendet nur 1 CPU-Kern
- 14. Ersetzen BGL iterieren über Eckpunkte mit "reinem" C++ 11 Alternative?
- 15. C++ 11: SFINAE in Template-Parametern, GCC vs Clang
- 16. Clang ++ nicht verstehen, C++ 11 in Mac-Terminal
- 17. Warum verbietet Google C++ 11 und investiert gleichzeitig in Clang?
- 18. C++: Alternative zu 'std :: is_fundamental'?
- 19. mit C++ 11 mit GYP-Projekt
- 20. C# Alternative zu Schienenmigrationen
- 21. C++ Alternative zu perror()
- 22. Beste Alternative für bereichsspezifische Enums - Pre C++ 11
- 23. OpenMP-Code zu C-Code kompilieren
- 24. C++ 11 Platzhalter mit Boost
- 25. Ersetzen Sie BOOST_FOREACH durch "reine" C++ 11 Alternative?
- 26. C++ OpenMP Programm
- 27. mit C++ 11 Platzhalter als Lambdas?
- 28. Mit CRTP als Alternative zu abstrakten statischen Methoden in C++ 11
- 29. Neueste C++ 11 Funktionen mit Android NDK
- 30. Wie C++ 11 mit Distutils angeben?
Dies wäre besser für codereview.stackexchange.com geeignet. Abstimmung für die Migration –
openmp Unterstützung in Clang wird überprüft. Derzeit wird Version 3.1 unterstützt und Version 4.0 wird entwickelt. – xryl669
clang 3.4 plus OpenMP ist verfügbar unter http://clang-omp.github.io/ – mabraham