No Such Blog or Diary
そういえば
- 2008-10-27 (Mon)
- 一般
OpenMPのreductionで||とか使ったら評価はどうなるんだ? ||でのリダクションって並列化するとまずいんじゃないだろうか?
やってみた.関数fは引数がtrueならtrueを返して即座に抜け,それ以外は重たい処理をしてからfalseを返す.配列bsはbs[0]のみtrueで他はfalse.これで,逐次実行時にはi=0でrにtrueが入り以降はfの処理をしないので即座に計算が終わる.一方,並列実行時にi=0を含まない反復範囲の計算が行われるとしたら,その部分の計算では重たいfの処理が大量に行われ,計算時間がかさむはず.
#include<iostream> #include<vector> bool f(bool b) { unsigned int u = 0; if(!b) { for(int k = 0; k < 100000; k++) { u = (u + 2) % 7; } u = u ^ (((u/4)<<2) | (u&3)); } return b ^ (u!=0); } int k = 2; int main(int argc, char *argv[]) { int n = 10000000; std::vector<bool> bs(n); for(int i = 0; i < n; i++) { bs[i] = i == 0; } bool r = false; #pragma omp parallel for reduction(||:r) for(int i = 0; i < n; i++) { r = r || f(bs[i]); } int res = r; std::cout << res << std::endl; }
結果:逐次は一瞬,並列だと遅すぎて時間計るのも馬鹿らしい.
ということで,||でのリダクションを並列化するのはあまり意味がない気がする.さらに,本来評価されないものが評価される可能性が出てくるので,セグフォって落ちるプログラムが出来上がるかもしれない.なぜにOpenMPは||もリダクションに使えるようにしているのだろう?
- Comments: 0
- TrackBack (Close): -
ボイドキューブ
- 2008-10-26 (Sun)
- 一般
商品のレビューとかで「難しい」とか「ルービックキューブでは起こらないことが起こってしまう」とか言っているけど…,本当に難しいのだろうか? ツクダ式でやる分にはただのルービックキューブと同じに解けると思うのだけど.
唯一の落とし穴は,一番最後にエッジキューブ二つが通常の手順で揃えられなくなるということだろうけど….これってセンターキューブが存在していればセンターキューブがずれている状態なので,センターのずれを直すような手順を踏めば直る.
ツクダ式だと見かけ上の不思議パターンは一つのみで,最後に中間層をそろえるときに,対面になっているエッジキューブが共通の面を完成させつつ入れ替わっている状態のはず.この状態は,そろっているように見える残りのエッジキューブ2個とを巻き込んでエッジキューブを入れ替えた後にルービックス・マヌーバー2回で直る.
- Comments: 0
- TrackBack (Close): -
発掘
- 2008-10-25 (Sat)
- 一般
足りないなぁと思われていた長袖の服がこの度スーツケースの中から数枚発掘された.誰だ片付けてなかったのは….また仕舞いどころに悩みそう.
- Comments: 0
- TrackBack (Close): -
もう一回休み
- 2008-10-23 (Thu)
- 一般
このタイミングで人に移すのもあれなので家で大量のしょうがを入れたスープを飲みながら寝る.
- Comments: 0
- TrackBack (Close): -