自己紹介

太田一樹。
東京の大学の情報科学科に通う大学生。moratorium満喫中。

お勧め書籍 [全部見る]

飾り

Search


Category Archives

Recent Entries

  1. 論文
  2. JJUG CCCでプレゼンします
  3. kzk's bookshelf
  4. En Google by Gulfweed
  5. PNUTS
  6. コメントスパム対策
  7. Hadoop + Luceneで分散インデクシング
  8. Hadoopの解析資料
  9. Cluster 2008
  10. SWoPP 2008

2006年10月20日

CPU実験(3)

ushさんの尽力により、処理だけは最後までは走ったらしい(base.sld on simulator)。でも真っ黒。

しかしC言語でfloatと書いても実はdoubleで扱われることがあるのはどうしたものか。printfをはさむとfloatとして扱われるようになるという謎現象も確認。まぁ普通は単精度なんて使わんからねぇ。ビットを変えずに uint -> float に変換する部分がこんな感じになっている。


float gf;
float *gfp;
float uint2float(unsigned int i)
{
  cerr << "uint2float: " << i << endl;
  unsigned int *ip = &i;
  gfp = (float*)ip;
  gf = (*gfp);
  return gf;
}

cerrを抜くと結果が変わってくる。ちょっとgccの挙動を調べた方がいいな。

ちなみにppm形式はWindowsだとIrfanViewで見れるみたい > IS2006er

HWの方はnaokiさんによりUSBが完動(負荷テストクリア)、yamaさんによりSRAMが動作(本格的な負荷テストはまだ)するようになったらしい。すばらしー。いい感じ。

-----

(2006/10/20)

ポインタを引数に取るような関数を間に挟んだら成功した。


unsigned int float2uintp(float *fp)
{
  unsigned int *ip = (unsigned int *)fp;
  unsigned int i = (*ip);
  return i;
}
float uint2floatp(unsigned int *ip)
{
  float *fp = (float*)ip;
  float f = (*fp);
  return f;
}
unsigned int float2uint(float f)
{
  float *fp = &f;
  unsigned int i = float2uintp(fp);
  return i;
}
float uint2float(unsigned int i)
{
  unsigned int *ip = &i;
  float f = uint2floatp(ip);
  assert(i == float2uint(f));
  return f;
}


trackbacks

trackbackURL:

『CPU実験(3)』の関連記事

comments

浮動小数点数の計算について、レジスタ上では 80 ビットで計算して、メモリに突っ込むときに 32/64 ビットに切り詰めるという Intel 系プロセッサの罠ではないかと思います。前後のプログラムやコンパイラの最適化の具合で、レジスタ上でどれだけ計算をやりくりするかか変わるので、結果が変わってしまうのです

試してませんが、 volatile とか付けるとどうでしょうね

  • け (is2005)
  • 2006年10月20日 12:13
comment form
comment form