2013-06-21 39 views
11

Clang không hỗ trợ OpenMP (chưa) nhưng có thể triển khai "song song cho" với C++ 11 không?C++ 11 thay thế cho OpenMP với clang

+3

Điều này sẽ phù hợp hơn với codereview.stackexchange.com. Bỏ phiếu để di chuyển. –

+1

hỗ trợ openmp trong Clang đang được xem xét. Hiện tại phiên bản 3.1 được hỗ trợ và phiên bản 4.0 đang được phát triển. – xryl669

+2

clang 3.4 cộng OpenMP có sẵn tại http://clang-omp.github.io/ – mabraham

Trả lời

7

OpenMP phiên bản:

// 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 phiên bản:

// 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 khoản (firstprivate ...) có thể được thực hiện trong cùng một cách nhưng nó (một chút) làm việc nhiều hơn ...

+2

Chỉ cần nói rằng, trong khi đây là một ví dụ tốt mà nó có thể được thực hiện trong C++ 11, nó có nhiều hạn chế. Trong OpenMP, các luồng không được nối ngay sau khi tính toán, như trong ví dụ. Trong một ví dụ chi tiết hơn, điều này sẽ thêm một chi phí đáng kể trong phiên bản C++ 11, trừ khi vectơ "chủ đề" được làm lại để xử lý các công việc khác nhau, do đó làm cho mã thậm chí còn ít đọc được hơn. – xryl669

+0

@ xryl669 Tôi đề nghị thư viện này cho công việc đó, nó giữ mã có thể đọc được và dễ sử dụng. https://code.google.com/p/threadpool11/ – Etherealone

+0

Dường như với tôi rằng lambda đang chụp vectơ 'threads', tại sao vậy? – remram

Các vấn đề liên quan