2013-06-21 13 views
11

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

+3

Dies wäre besser für codereview.stackexchange.com geeignet. Abstimmung für die Migration –

+1

openmp Unterstützung in Clang wird überprüft. Derzeit wird Version 3.1 unterstützt und Version 4.0 wird entwickelt. – xryl669

+2

clang 3.4 plus OpenMP ist verfügbar unter http://clang-omp.github.io/ – mabraham

Antwort

7

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 ...

+2

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

+0

@ 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

+0

Es sieht für mich aus, dass das Lambda den 'threads' Vektor fängt, warum ist das? – remram

Verwandte Themen