こんにちは.@rootxです.
高速化って大切ですよね.
結果が出るまで待てない,AWSに余計なお金を払いたくない,などなど,進化した計算機といえどもCPU資源を使いきって高速に処理する需要はなくなることはありません.
CPU自体の進化も,クロックの高速化競争の集結を迎え,シングルスレッド性能は頭打ちになってきています.
この背景には,半導体プロセス微細化によるリーク電流や,数GHzを超えると電子の移動速度も際どくなる等が要因として挙げられていたと記憶しています.
# 消費電力あたりの性能,という指標は個人的には好きではありません….
そのため,現在のCPUではマルチコア,ハイパースレッド等の技術によって,処理を複数同時に実行できることでCPU全体としての性能向上を維持しています.
プログラミング技術においてもその方向に進んでいて,いかに並列処理をするか,というのが現代的なプログラムの重要なポイントの1つとなっています.
様々な並列処理手法がありますが,C++で開発する際に,お手軽に並列化する方法の1つにOpenMPというライブラリがあります.
このOpenMPは,名前がちょっとOpenGLに似ていますが全然関係なくて,並列処理を簡易的に実装する
しかも最近のVisual Studio(VS2010以降?)では標準的に使えるようになっていて,
プロジェクト設定をちょいちょいと変えてあげるだけで有効になる,とってもとっても便利なライブラリで,特にレイトレのような並列化の容易なアプリケーションでは,たった1行追加するだけでバリバリ並列化できちゃう夢のような仕組みです.
しかし残念なことに,OSX上のXCodeで開発している場合は,VSほど簡単に有効にすることはできないようです.これはXcodeの標準コンパイラがLLVM clang3.5であり(MacOS 10.9.5 Xcode6.2時点),ちゃんと対応されていないバージョンのためです.
そのうち標準対応されるのではないか,と想像していますが,現時点では望めません.
# 10.10の環境は未調査.今のところ,あのフォルダアイコンのださいOSをメイン環境として使う気がないため.
ということで,自前でスレッド処理するが,gccに切り替えて使うべきか,いっそのことWindowで開発するか,といった悩ましい問題が目の前に立ちはだかっているのです.
いろいろ探していましたが,OpenMPを有効化したclang-ompが配布されていたので導入す
ここから本題です.
Xcodeで clang-omp の使い方
- homebrew でclang-ompをインストール: brew install clang-omp
- Xcodeプロジェクトを作成
- ビルドセッティング(Build Setting)で:
- 新しいユーザ定義設定 CC を次の値で作成:/usr/local/bin/clang-omp
- -fopenmpをOther C Flagsに追加
- /usr/local/includeをHeader Search Pathsに追加
- Enable Modules (C and Objective-C)をNoにセット
- ビルドフェーズ(Build Phases)で:
- /usr/local/lib/libiopm5.dylibをLink Binary With Librarianに追加
- (*)/usr/local/binにhomebrewでインストールされたclang-omp++というエイリアスがあるので,clang++-ompに名前を変更
これで完了.あとは
#include <libiomp/omp.h>して,
#pragma omp〜〜を使うだけ?.
注意
なぜかビルドできませんでしたが,上記手順の5を追加することで上手く動くようになりました.
どうやらXcodeは,C++のコンパイル時にCCに定義されたものを自動的に置換しているようです.その際に,末尾に++を追加するのではなく,clangをclang++に置換するようです.(途中のバージョンで仕様が変わったのかな…)
ということで,暫定的な対策ですが,clang-omp++の名前をclang++-ompにすることで,上手くそれを使ってくれるようにできました.
補足
glmがコンパイラを認識できずに次のエラーを出しましたので対応しました.
/usr/local/include/glm/detail/setup.hpp:287:2: error: "GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message."#error "GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message." ^1 error generated.Command /usr/local/bin/clang-omp failed with exit code 1
TODO
後日,効果を検証します.
なんかビルド時のエラーの出かたが変化した気がする…
でわでわ.