2013-06-21 21 views
11

Clang, OpenMP'yi desteklemiyor (henüz), ancak C++ 11 ile "paralel için" uygulamak mümkün mü?C++ 11 Openpoint with clang

+3

Bu codereview.stackexchange.com için daha uygun olacaktır. Taşınma oyu. Clang'deki –

+1

openmp desteği gözden geçiriliyor. Şu anda sürüm 3.1 desteklenmektedir ve sürüm 4.0 geliştirilmektedir. – xryl669

+2

clang 3.4 artı OpenMP, http://clang-omp.github.io/ – mabraham

cevap

7

OpenMP sürümü:

// 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 sürümü:

// 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 fıkrasının (firstprivate ...) aynı şekilde uygulanan ancak bu kadar olabilir (biraz) daha fazla iş ...

+2

adresinde mevcuttur. Sadece bunun, C++ 11'de yapılabilen iyi bir örnek olsa da, bunun birden fazla dezavantajı olduğunu söyleyebiliriz. OpenMP'de, iş parçacığı örnekte olduğu gibi hesaplama işleminden hemen sonra birleştirilmez. Daha ayrıntılı bir örnekte, bu "iş parçacığı" vektörü farklı işleri işlemek için yeniden işlenmediği sürece C++ 11 sürümünde önemli bir ek yük oluşturacaktır, böylece kodu daha az okunabilir hale getirecektir. – xryl669

+0

@ xryl669 Bu kitaplığı bu iş için öneririm, kodun okunabilir olmasını sağlar ve kullanımı kolaydır. https://code.google.com/p/threadpool11/ – Etherealone

+0

Bana lambda'nın 'thread' vektörünü yakaladığını görüyoruz, neden bu? – remram