No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 1045 | 1046 | 1047 |...| 1183 | 1184 | 1185 || Next»

手は進まず

なんとなく評価関数がわからないのに最適化しようとしているイメージが…

なにげに

セブンイレブンの500ml98円の麦茶がおいしい気がする.

風邪が

喉は良くなったのだが腹に来たのかしら? ダメだこりゃ.

久々にgolf

10分ずつぐらいでAlnum challengeを48B,character subsetsを108B.Alnum challengeは8文字を3回10倍する方法以外思いつかない.あとはsとかで使っている記号をアルファベットとかに置き換えたら終わりだ…とか思っていたら出すもの間違って記号だらけのものが記録されてしまった.character subsetsは何も考えずに再帰的に文字をつけないのとつけたののリストをくっつけていく感じで.

さて,次の仕事に行こう.

さて

メーリングリストにあるパッチを当ててGCCをコンパイルするってのは世間的にどれくらい面倒なことなのだろうか? 回避策を用意しておくべきか…

そういえば

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は||もリダクションに使えるようにしているのだろう?

«Prev || 1 | 2 | 3 |...| 1045 | 1046 | 1047 |...| 1183 | 1184 | 1185 || Next»
Search
Feeds

Page Top