[[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 まあ、まだまだこの路線でやることあるんだけどね。 |