2013-06-21 15 views
11

Clang non supporta OpenMP (ancora) ma è possibile implementare un "parallelo per" con C++ 11? VersioneC++ 11 alternativa a OpenMP con clang

+3

Questo sarebbe più adatto per codereview.stackexchange.com. Votazione per la migrazione. –

+1

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

+2

clang 3.4 plus OpenMP è disponibile all'indirizzo http://clang-omp.github.io/ – mabraham

risposta

7

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

+2

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

+0

@ xryl669 Raccomando questa libreria per quel lavoro, mantiene il codice leggibile ed è facile da usare. https://code.google.com/p/threadpool11/ – Etherealone

+0

Mi sembra che il lambda stia catturando il vettore 'threads', perché? – remram