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
Trả lời
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 ...
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
@ 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
Dường như với tôi rằng lambda đang chụp vectơ 'threads', tại sao vậy? – remram
- 1. clang ++ C++ 11 invocation
- 2. C++ 11 chủ đề với clang
- 3. C++ 11 thay thế cho localtime_r
- 4. Bao gồm tiêu đề C++ 11 với Clang/LLVM
- 5. C++ 11 thay thế pthread_cond_timedwait
- 6. Thay thế cho -pg bằng Clang?
- 7. Sử dụng C++ 11 unordered_set trong Visual C++ và clang
- 8. Kích hoạt hỗ trợ C++ 11 trong Clang
- 9. Sử dụng clang với libC++ và C++ 11 từ dòng lệnh với mac os x
- 10. Thay thế BGL lặp qua các đỉnh với thay thế C++ 11 "thuần túy"?
- 11. C++ 11 placeholders với tăng
- 12. Sử dụng quét-xây dựng của Clang với scons và C++ 11
- 13. Thay thế BOOST_FOREACH bằng tùy chọn "thuần túy" C++ 11?
- 14. sử dụng C++ 11 với dự án GYP
- 15. mex matlab Clang C++ 11 chủ đề -> ký tự Không xác định lỗi
- 16. AST cho nhiều tệp nguồn với clang
- 17. Khóa RW cho chủ đề C++ 11
- 18. Tại sao mã C++ này biên dịch khi sử dụng clang -std = gnu ++ 11?
- 19. C# HPC - MPI và OpenMP
- 20. Biên dịch tăng C++ 11 clang mac không thể tìm thấy cstddef
- 21. C++ 11 constructor quá tải độ phân giải và initialiser_lists: clang ++ và g ++ không đồng ý
- 22. Clang định nghĩa macro nào để thông báo chế độ C++ 11, nếu có?
- 23. OpenMP và STL-style cho
- 24. Emacs + C/C++ + Doxygen: Thay thế cho doxymac? Với yasnippet?
- 25. OpenMP với OCAML
- 26. Tại sao Google cấm C++ 11 và đồng thời đầu tư vào Clang?
- 27. Làm cách nào để sử dụng các tính năng C++ 11 trong Clang?
- 28. Tính năng C++ 11 mới nhất với Android NDK
- 29. C++ 11 std :: mảng
- 30. Lỗi với __int128_t trong Clang?
Điều này sẽ phù hợp hơn với codereview.stackexchange.com. Bỏ phiếu để di chuyển. –
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
clang 3.4 cộng OpenMP có sẵn tại http://clang-omp.github.io/ – mabraham