Настройка OpenMP на LLVM для Xcode
Начиная с Релиза 3.8.1 Clang/LLVM поддерживает нативно OpenMP 3.1
OpenMP - это открытый стандарт для распараллеливания для языков C/C++/Fortran и open source библиотека.
Далее с проекте Xcode в настройках Target'а (Build Settings) добавляем новую User-Defined переменную СС=/usr/local/bin/clang-omp
В часть Other C Flags добавляем новый флаг -fopenmp
Header Search Paths = /usr/local/include
Library Search Paths = /usr/local/lib
Далее во вкладке Build Phases
В раздел Link Binary With Libraries добавляем библиотеку libiomp5.dylib :
После нажатии + жмем Add Other...
Когда появится окно выбора файлов нажимаем '/' и прописываем путь к нашей библиотеке /usr/local/lib/libiomp5.dylib
Для OSX El Capitan может понадобится создать симлинк для С++ компиллера:
Все, теперь можно написать небольшой код, чтобы посмотреть, что OpenMP работает:
Но OpenMP использует только CPU (поддержка GPU пока не полна и фрагментарна). Можно использовать GPU с OpenCL
OpenMP - это открытый стандарт для распараллеливания для языков C/C++/Fortran и open source библиотека.
На данный момент сборка clang - основного компилятора для Xcode от эплов не поддерживает OpenMP из коробки. Но такую поддержку легко можно добавить:
Для начала поставим сам компилятор:
brew install clang-omp
Далее с проекте Xcode в настройках Target'а (Build Settings) добавляем новую User-Defined переменную СС=/usr/local/bin/clang-omp
В часть Other C Flags добавляем новый флаг -fopenmp
Header Search Paths = /usr/local/include
Library Search Paths = /usr/local/lib
Далее во вкладке Build Phases
В раздел Link Binary With Libraries добавляем библиотеку libiomp5.dylib :
После нажатии + жмем Add Other...
Когда появится окно выбора файлов нажимаем '/' и прописываем путь к нашей библиотеке /usr/local/lib/libiomp5.dylib
Для OSX El Capitan может понадобится создать симлинк для С++ компиллера:
sudo ln -s /usr/local/bin/clang-omp++ /usr/local/bin/clang++-omp
Все, теперь можно написать небольшой код, чтобы посмотреть, что OpenMP работает:
#include <iostream>
#include <vector>
#include <chrono>
#include <libiomp/omp.h>
using namespace std;
int main(){
typedef double calculation_type;
size_t size = 10000000;
vector<calculation_type> A(size, 42);
vector<calculation_type> B(size);
vector<calculation_type> C(size);
auto start_for = chrono::steady_clock::now();
for (size_t i = 0; i < size; ++i) {
B[i] = A[i] + B[i];
}
auto end_for = chrono::steady_clock::now();
auto start_mp = chrono::steady_clock::now();
#pragma omp parallel for
for (size_t i = 0; i < size; ++i) {
C[i] = A[i] + C[i];
}
auto end_mp = chrono::steady_clock::now();
cout << "single for: "
<< chrono::duration<double, milli>(end_for - start_for).count()
<< " ms" << endl;
cout << "openmp for: "
<< chrono::duration<double, milli>(end_mp - start_mp).count()
<< " ms" << endl;
return EXIT_SUCCESS;
}
Результаты
single for: 70.4477 ms
openmp for: 22.1819 ms
Но OpenMP использует только CPU (поддержка GPU пока не полна и фрагментарна). Можно использовать GPU с OpenCL
Комментарии
Отправить комментарий