[[FrontPage]]

*概要 [#z0b6f7ee]
-並列化はエンジニアの必須スキル

*C++ [#td04e7bc]
pthreadを使ったreductionとかそのへんのライブラリやつないかな
 
Threadは最後に必ずjoinかdetachスル必要ありhttp://suikaba.hatenablog.com/entry/2014/08/19/225703
Lock Guardをつかうと、{}でくくったところで勝手にMutexのlock unlockをやってくれるのでunlockしわすれに安全
http://minus9d.hatenablog.com/entry/20130914/1379168684
asyncは戻り値付きthread...ではない!何故かasync(); async();すると前半の終了を待つ。どういうこと。
C++11ではpthreadなしにthreadを使うと、謎のランタイムエラー(C++14からはリンクエラーになる) http://qiita.com/yoh2/items/97821d3d1dbe3e024d4f
 
C++のparを利用すると、以下の関数を勝手に並列化してくれる!!特にfor each, reduce, transform_reduceなど、一般性の高いもの。
http://faithandbrave.hateblo.jp/entry/2016/09/27/155500

**OpenMP [#f3e14bdf]
OpenMPは、複数のノードにまたがった並列プログラムは記述できません。 OpenMPは、非常にループ指向で、アルゴリズムやデータ構造レベルのパラレリズムを扱えません。
チートシート>http://www.openmp.org/wp-content/uploads/OpenMP-4.0-C.pdf
critical
http://stackoverflow.com/questions/7798010/openmp-atomic-vs-critical
マルチスレッドで注意スべきこと
グローバルのアクセス(読み書き両方)の前にはlock, unlock
提供されている関数もやばいときがある(中でグローバルを使っているなど)
reductionってなんなの?*も会ったりするの?
OpenMPのreductionの記号は、単位元の違い!maxとかも使えるらしい。可換は前提されているのか(そもそも可換なオペレータについてしかサポートしていないっぽい)
全部の変数を全列挙して、何がどこの指示子でどう制御されているのか?を把握すべき#pragma omp parallel shared(a,b,c,d) private(i)のように
ラムダの形を突っ込むとreductionしてくれるようなものがある。 https://terboven.com/2008/09/11/c0x-openmp-loop-parallelization-without-pragmas/
reductionはsharedの指定がめんどうくさくないとpragma omp forっていうだけなのかなあ→いいえ!!そうではなく、ただのforだと共有変数にO(n)回lock, unlockがかかってる…というわけではない!!!!OpenMPにはロックの概念がないので、sharedは「初期化をサボる」という意味でしか無い。なので、きちんとスコープを意識してプログラムすればprivateとsharedを使う必要はない?
OpenMPには、
atomic
critical
が存在します。
クリティカルセクション
ブロックのコードの直列化(serialization)を保証します。
name タグを利用して、ブロックのグループを直列化できます。
スピードが遅いです。
アトミックオペレーション
スピードが速いです。
特別なオペレーションの直列化だけを保証します。(http://www.openmp.org/wp-content/uploads/OpenMP-4.0-C.pdf)


*セマフォ [#hf399f31]
-マルチプロセスのmutex的なデータ共有はセマフォ


*並列アルゴリズム [#rc25f5e7]
-並列に更新できるタイプのDPをGroverで高速化するネタ、まとめてやられてた。
arxiv.org/abs/1807.05209
まあ、まだまだこの路線でやることあるんだけどね。



トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS