Настройка OpenMP на LLVM для Xcode

Начиная с Релиза 3.8.1 Clang/LLVM поддерживает нативно OpenMP 3.1

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

Комментарии

Популярные сообщения из этого блога

Алгоритм NEAT. Эволюционирующие нейронные сети возрастающих топологий.

Цепи Маркова простыми словами. Пишем пирожки.