2010年10月28日
3000キロ
- 2010-10-28 (Thu)
- 一般
自転車のオドメーターが3000キロを突破してた.記録によると2006年4月28日に手元に来たらしいから,4年半でようやく3000キロ達成.
もう一つの軽い折りたたみの方は930キロだった.こっちは2年弱だった気がする.
とりあえず,平均で年に850キロ程度は走っているらしい.1日平均にすると2.4キロなので大したことない距離だなぁ.平日毎日14キロ走って学校通ってた頃が懐かしい.
- Comments: 0
- TrackBack (Close): -
TeX で普通に記号を書きたい
- 2010-10-28 (Thu)
- 一般
\textbackslash, \textasciitilde, \textasciicircum, \textdollar, \textasteriskcentered など.
忘れた頃に必要になるのでメモっておく.
- Comments: 0
- TrackBack (Close): -
lastprivate の罠
OpenMP の parallel for でローカルの値を外に持ち出す指定のひとつ lastprivate の意味を間違って覚えていると罠にハマる.last private であって last assigned private ではなかった.
下のようなプログラムを書いた.いつでも 2 が表示されて欲しい,つまり,lastprivate指定の変数は最後に代入された値を外に持ち出してくれると期待していた.
#include <omp.h> #include <iostream> struct mystruct { int f; mystruct() : f(-1) {} mystruct(int f) : f(f) {} }; int main(int argc, char *argv[]) { mystruct ms(1); #pragma omp parallel for lastprivate(ms) for(int i = 0; i < 4; i++) { if(i == 2) { mystruct msi(2); ms = msi; } } std::cout << ms.f << std::endl; return 0; }
が,実行してみると以下のような結果になった.
> OMP_NUM_THREADS=1 ./lastprivate 2 > OMP_NUM_THREADS=2 ./lastprivate 2 > OMP_NUM_THREADS=3 ./lastprivate 2 > OMP_NUM_THREADS=4 ./lastprivate -1
何かというと,lastprivate指定の変数は最後のプロセスの持つローカルな値をグローバルにコピーしてループを終了する,という仕組みであったと.確かにOpenMPの仕様にはそう書いてあるし,逐次実行時に最後に実行される反復で値を代入しない場合にはオブジェクトの初期値になっちゃうよ,とも書いてある.上のプログラムでの最終反復(i = 3)では変数 ms に値が代入されないため,その初期値(-1)になってループ終了と.
うーん,find みたいに最後に条件を満たすインデックスを探すとかいうループすらもOpenMPだと簡単に書けないのか… (FORTRAN なら MAX での reduction 指定ができるので可能だけど).
lastassignedprivate とかいうディレクティブの方が使い勝手が良いと思うのは気のせいだろうか? 変数についてフラグ一個持てば直ぐに実装できるのに… とりあえず OpenMP の reduction の制限がきつすぎるのが良くない.
- Comments: 0
- TrackBack (Close): -