最新 追記

ema log


2009年02月01日 [長年日記] この日を編集

_ [最近]電源交換

400W か 450W か控えてこなかったので、500W のモデルを選択。ツクモの店員さんの薦めで、ANTEC NeoPower 500にしました。前の電源は2006年のものなのですが、結構変わるものですね。ファンがへたってきてたりしてたのかもしれません。

電源の交換作業は思ったより、面倒だった・・・5 inch ベイのDVD外さないと取り外せなかったり、はめ込むのに一苦労したりでした。何はともあれ直って良かった・・・

後、1T の HGST の HDD が 8000 円を割っていたので購入。OSごと入れ替えようと思います。実家に250GBのHDDが転がっていたのですが、これって壊れてたんだっけ??という感じですが、確か、使えたと思うんです。ジャンク扱いで良ければどなたかいりませんか?後で、物理フォーマットはしてみます。

お名前 : コメント :


2009年02月02日 [長年日記] この日を編集

_ [最近]また壊れた

直ったのもつかの間、また壊れました。電源か、マザーっぽい気がする壊れ方。また、電源借りてきて検証…

電気系統の問題?タップをかましてはいますが…

お名前 : コメント :


2009年02月03日 [長年日記] この日を編集

_ [Programming]SIMD演算

体調崩して寝込んでました.そんなこんなで,たまには,プログラムネタを書いておかないとという気分になったので.図が無くて,文字ばっかでごめんなさい.

最近のCPUにはSIMD演算と呼ばれる命令群が搭載されています.たとえば,x86ならSSE,PowerPCならAltiVecなんかがそうです.SIMD*1 というのは,Single Instruction, Multiple Dataの略で,複数データに同じ演算を施すことを意味します.

コンピュータアーキテクチャ 定量的アプローチ 第4版 (IT Architects’ Archive)(John L. Hennessy/ジョン・L・ヘネシー/デイビッド・A・パターソン/David A. Patterson/中條 拓伯/吉瀬 謙二/佐藤 寿倫/天野 英晴)

これらの世界では,データはスカラとベクトルに区別されます. 例えば,SSEやAltiVecでは128bitのレジスタを8〜64bit単位に区切ってベクトルとしています. これらでは,128bitを,32bit整数×4や,32bit浮動小数点×4として扱います.

それの何が嬉しいかというと,一番わかりやすいのは,同時に働く演算器の数が増えることです.例えば,x86 のとある世代の FADD という80bit浮動小数点の加算命令はレイテンシーが6,スループットが1ですが,32bit浮動小数点4つ同士を加算するADDPS(おそらく,ADD Packed Single float の意味)のレイテンシーは5,スループットは2となっています[2].bit数の違いはありますが,浮動小数点の演算器を並列に並べているので,4つの計算を一度に並列に行えるわけです*2

ということで,SIMD演算を利用する際には,(32bitを使うことが多いでしょうから)データを4つずつに区切っての演算が基本になります.特に,SSEではベクトル同士の演算(垂直演算)が中心で,ベクトル内の演算(水平演算)はSSE2ではほとんど存在しません*3.小難しく書くと,要はベクトル同士が独立していることを前提としています.画像で書くと,ある4画素値の計算に,手前の1画素が必要だったりすると面倒なことになるわけです.また,RGBRGBとバイト単位で並んでいるよりは,RRRRGGGGBBBBと各画素が独立している方が扱いやすくなります.演算本体よりもそのデータの用意が面倒ですw

実際の,SSEの利用には,「IA-32 SIMDの扉」というページがわかりやすいです.「ネガティブ」では最も単純な4画素値ずつの反転処理が,「モノクロ変換」では,演算のしやすさを考えて並び替えを行う例が示されています.

ここではインラインアセンブラが使用されていますが,最近のコンパイラ(gcc, icc, Visual C++のいずれでも利用可能)には intrinsic [3] と呼ばれるものが備わっていて,Cの関数呼び出しのようにSSEを利用できます*4intrinsic関数はVCとgccとで共通化され,しかも32bit, 64bit両対応なため汎用性も高いそうです[4]し,どうやらコンパイラの最適化の対象にもなります[5].使い方は「SSE についてのメモ(2) SSE4など」や「SSE2 performance optimization.」などがわかりやすいです.

例えば,SSE2 の利用であれば,emmintrin.h を読み込んで,以下のように計算します.結果は 2, 4, 6, 8 のように出力されます.データの並び順に注意して下さい.

#include <stdio.h>
#include <emmintrin.h>

int main(void) {
  __m128i a,b,c; // 実際には xmm のどれかに割り当てられる.
  int i, dst[4];
  int src[4] = { 1, 2, 3, 4 };

  // データの用意.
  a = _mm_loadu_si128( (__m128i*)src ); // メモリから4つまとめて読み出す
  b = _mm_set_epi32( 4, 3, 2, 1 ); // マクロでレジスタを初期化.↑との並び順の違いに注意.逆アセすると偉いことにw

  // 4つまとめて加算する.4.times {|i| c[i] = a[i] + b[i] } と等価
  c = _mm_add_epi32( a, b );

  // 結果表示用に,メモリに4つまとめて書き戻す
  _mm_storeu_si128( (__m128i*)dst, c );

  for(i=0; i<4; i++) {
    printf("%d, ",dst[i]);
  }
  printf("\n");
}

gcc でコンパイルする場合には,-msee2 が必要です.gcc 4.2.4 で動作確認しました.dst については確実にアラインして,_mm_load_si128, _mm_store_si128 を用いる方が性能面では望ましいです*5

実際に,どのようにコンパイルされるかをみてみると,(ここでは,わかりやすさのために,アラインして,最適化オプションは -O1 -msse2 にして,_mm_set_epi32 を使っていません.O3 にすると,命令が並び変わっていました)

#include <stdio.h>
#include <emmintrin.h>

int main(void) {
  __m128i a,b,c;
  int i;
  int dst[4] __attribute__((aligned(16))) ;
  int src1[4] __attribute__((aligned(16))) = {1,2,3,4};
  int src2[4] __attribute__((aligned(16))) = {2,3,4,5};

  a = _mm_load_si128( (__m128i*)src1 );
  b = _mm_load_si128( (__m128i*)src2 );
  c = _mm_add_epi32(a,b);
  _mm_store_si128( (__m128i*)dst, c );

  for(i=0; i<4; i++) {
  	printf("%d, ",dst[i]);
  }
  printf("\n");
}

これを,コンパイルして objdump -d すると

80483b7:       c7 45 c8 01 00 00 00    movl   $0x1,-0x38(%ebp) // src1 の用意
80483be:       c7 45 cc 02 00 00 00    movl   $0x2,-0x34(%ebp)
80483c5:       c7 45 d0 03 00 00 00    movl   $0x3,-0x30(%ebp)
80483cc:       c7 45 d4 04 00 00 00    movl   $0x4,-0x2c(%ebp)
80483d3:       c7 45 b8 02 00 00 00    movl   $0x2,-0x48(%ebp) // src2 の用意
80483da:       c7 45 bc 03 00 00 00    movl   $0x3,-0x44(%ebp)
80483e1:       c7 45 c0 04 00 00 00    movl   $0x4,-0x40(%ebp)
80483e8:       c7 45 c4 05 00 00 00    movl   $0x5,-0x3c(%ebp)
80483ef:       66 0f 6f 45 c8          movdqa -0x38(%ebp),%xmm0 // src1 の読み出し
80483f4:       66 0f fe 45 b8          paddd  -0x48(%ebp),%xmm0 // src1 と src2 の加算
80483f9:       66 0f 7f 45 d8          movdqa %xmm0,-0x28(%ebp) // dst への保存

のようになります.x86ではメモリをオペランドに指定できるので,movdqa は一つしかないですが,intrinsic と SSE 命令が1対1に対応しながらも,コンパイラによる最適化の恩恵にも与れることが確認できました*6

ほかにも,メモリアクセスなどでも有利だったり,アラインしてないとロードストアがなどなど,メモリの問題がありますが,今回は一番基本的な演算部分だけおおざっぱに書いています.SSE化より,プリフェッチ命令の方が効いたりすることもあるでしょう.

References
[1] コンピュータアーキテクチャ 定量的アプローチ 第4版, p.211
[2] IA-32 インテル(R) アーキテクチャー最適化リファレンス・マニュアル, pp. C-11-C-14 (PDF)
[3] MMX, SSE, and SSE2 Intrinsics (C++)
[4] fast strlen and memchr by SSE2 (mitsunari@cybozu labs)
[5] 本の虫: Compiler Intrinsicの吐くコード
2.4 計算しやすいベクタデータの作成 - PS3 Linux Information Site / Cell/B.E.のパワーを体験しよう
IA-32 SIMDの扉
Compiler Intrinsics
SSE についてのメモ(2) SSE4など
SSE2 performance optimization.
【最新パーツ性能チェック(Vol.23)】いよいよプレスコット登場(PART2)! SSE3の神髄に世界で初めて触れる!

*1 読み方は日本ではシムドが一般的ですが,「へネパタ本」[1] の訳注では「シムディ」と発音して欲しいと書かれています.

*2 (たぶん.というのも,世代によっては整数は64bitの MMX ユニット2回で計算とかしてたような?それでも,普通にやるより速いけど)

*3 例えば,SSE2で,ベクトル内の総和をとることは大変です.いずれにせよ,SIMD演算に合わせてデータを用意しておかなければ大変なのですが・・・

*4 SSE使うような人たちはインラインアセンブラでごりごり書く人だからか,instrinsic の情報が少ない・・・

*5 gcc だと __attribute__((aligned(16))) をつけますが,VC などでは方式が違ったはずなので,ここでは_mm_storeu_si128としています.アラインされていないと,movdquなどでは,境界をまたぐデータの読み出しに複数データを読み出して合成するため遅くなります.

*6 paddd は Packed ADD Double word integer の略だと思われます.歴史的経緯により,x86 で word というと 16bit で,32bit なら double word, 64bitなら quadruple word となります.

お名前 : コメント :


2009年02月05日 [長年日記] この日を編集

_ [最近]今度こそ!

再度研究室から電源を借りてきて動いたので、初期不良で電源交換してきました。

新しい方のHDD認識してくれないなぁ・・・

それにしても体調が優れないというか睡眠がイマイチ変な感じになってしまっています。米国行き大丈夫かw

_ [最近]荷造りに必要なもの

  • パスポート,航空券,ESTAの控え
  • PC
  • パンツ,下着,靴下,シャツ×5

後は,暇つぶしを用意しておくぐらいかなぁ.DS持って行けばそれで完了ですが,論文も印刷して入れておこう.ホテルにネットがなさそうだし,コーディングとかは厳しいかなぁ.そんな元気ないだろうし.

ということで,お金おろしてきたら準備完了かな.他に何かいりそうなものって無いものでしょうか?

お名前 : コメント :


2009年02月06日 [長年日記] この日を編集

_ [最近]いってきます

テストも終了して,いろいろ印刷したし行ってきます.まぁ生きて帰ってはこれるでしょう!

携帯は国際ローミングできるので、時々つけていると思いますが、国際回線になりますので、お気をつけ下さい。メールはネットが利用できれば読めるのですが、会場ぐらいしか利用できない可能性もあります。

お名前 : コメント :


2009年02月08日 [長年日記] この日を編集

_ [最近]おのぼりさん

ホテルで有線インターネットが使えました.

メールの受信が終わらないので,その間に.現地時間は現在AM5:00でございます.日付変更線をまたいでいるので,2月8日の午前5:00なのです.日本は21:00ぐらいなのでしょうか.

こちらは,太陽の光が強く日向だと暑いのですが,乾燥しているのか日陰だと寒いという,鹿児島に行ったときを髣髴とさせる気候でございます.

旅程

伊丹行きのリムジンバスで,同行の1人と運良く合流.伊丹で3人がそろって,成田経由でサンフランシスコへ.

確実に,普段の食生活より機内食のほうがましでした.完全におのぼりさんですねw.デジカメを借りてきたのですが,SDカードリーダがないので,機内の風景しかなかったりです.国内線とは別世界ですねw.

不安のあった入国審査なども,親切な感じの係員さんでサクサク会話できました.ホテルのフロントの方もそうでしたが,日本人慣れしてる人だと楽で良いです.なんとか片言英語が通じます.

ブランド店が立ち並ぶ一角もあれば,そこから通りを2つ越えると近寄りたくないエリアになっていたりと,日本の平和さを改めて感じています.空港から市内への地下鉄(BART)でも,ギャング風の3人組が乗ってきたときにはさすがに,絡まれる恐怖を覚えました.結果的に,何事もなったのですが,勘弁してほしかったなぁ.

食生活が心配でしたが,ホテル近くのスーパーも見つかったので一安心.

多少,寝不足気味での出発だったのですが,機内ではまったく眠れず,延々とごそごそしていました.周りには申し訳ない感じで.昨日はそれでも,ホテル周辺を散策しようと試みたのですが,18:00には寝てましたw.

メール受信も終わったので寝なおしてきますノ

_ [最近]サンフランシスコ近代美術館

何もかもが,す,すごく大きいです.

メインが午後からだったので,幸運にも!近くにあったサンフランシスコ近代美術館へ.学生証をホテルに忘れたので通常料金でした.

# 完全に,僕の趣味で2人を連れまわしてしまいましたw

まったくよくわからないものも少なくなかったのですが,企画展の参加型アートなんかを楽しみつつ,ニューヨークの近代美術館をますます訪れてみたくなりました.結構スタッフが立っていて,質問すると気さくかつ丁寧に答えてくれて,すごく好印象でした!

一部,写真撮影もできたので,帰ってからアップしてみたいと思います. 西の方にある美術館には,「考える人」のオリジナルなんかもあるそうなのですが,訪ねられなさそうなのが残念です.

お名前 : コメント :


2009年02月10日 [長年日記] この日を編集

_ [最近] 米米

米が食べたいです.正確には「あっさりしたもの」が食べたいです.水っけがあるとなおいい感じで.

非常食に「どんべえ」を入れてきたのですが,コーヒーメーカーしか備品がありません.ポットをもらえないか聞くのが最終手段になりそうですw

ホームシックとか以前に,食文化?風習?が違いすぎます.塩分多すぎだろ(日本の)常識的に考えて.とつぶやいてしまいながら,生きています.

本番が始まって,英語漬けで精神的に疲れているのか,時差ぼけ,移動疲れなのかわかりませんが,なかなかに体力的にキツイです.

お名前 : コメント :


2009年02月11日 [長年日記] この日を編集

_ [最近]しんどいです

相変わらず体が重いです.足がむくみっぱなしです.十分に寝ているはずなのですが.

何もかもが大雑把な感じで,エレベーターの「加速度」に毎日負けそうになっています.

そんなこんなで,少し休憩中です.それにしても,コーヒーが口に合いません.ガロン単位で購入(特価で$1.04!)してきたクリスタルガイザーに救われていますw

写真は左から昨日の朝食,夕食,今日の昼食.ずっとこんな感じの食生活です(涙.昨日の夕食は,奥に見えるトーストまでついてきました.「Healthy」と書かれた,チキンのセットを頼んだはずですが.はて?w.エンゲル係数もすごく高いです.

お名前 : コメント :


2009年02月15日 [長年日記] この日を編集

_ [最近]帰ってきました

無事,昨晩帰宅しました.長時間の飛行機疲れがどっしりです.時差ぼけなんでしょうか?

向こうでも日本食を食べたりしましたが,味噌汁とカレーのすばらしさは世界に広まってほしいなぁ.

LDRのピンが100を超えかけていたので多少消化.消化なのか浪費なのか.

お名前 : コメント :


2009年02月18日 [長年日記] この日を編集

_ [最近]怪しい伝説の新シーズン放映してるよ・・・

実家にいないのが恨めしい。現在,ディスカバリーチャンネルの放映中のタイトルからWikipedia を見ると、Season 2008 だなぁ。

以下は,ニコニコ動画の公式チャンネルから見れる古いエピソードのダイジェスト.一番面白いのはアダムとジェイミーや三人組が工作しているところだと思っているので,ダイジェストでは物足りないです.

時差の影響で5時半おきでした。

お名前 : コメント :

本日のツッコミ(全2件) [ツッコミを入れる]

_ iwaiwa [みたい...]

_ ema [よね・・・]


2009年02月20日 [長年日記] この日を編集

_ [眼鏡] 眼鏡 第2話 始まりました。

irodori

第2話 始まりました。この先どうなるんでしょう?

【自主制作アニメ】眼鏡 2話A【毎月20日】

2009-02-20
再生: 31,573
コメント: 824
マイリスト: 100

【自主制作アニメ】眼鏡 2話A【毎月20日】 (01:51)
第2話はA~Fの6つぐらいを考えています。相変わらず作り貯めゼロの自転車操業なのでどうなるか分かりませんが…そして完結モノが多くなりそう?と言ったそばから早速の「つづく」展開。眼鏡は、毎月20日の夜に更新予定です。1話フル:sm5899034 (2話一覧もこちらに)作品リスト:mylist/8447028 irodoriサイト:www.iro-dori.jp/2話B sm64941112話フルできました!>sm7694368

wwwwwwwww 日の目を見るまであと ひゃっほーww クッキーより上手い ww wwwww ww ええええ 声優いいなw ツイッターのはこれだ 回収 wwww 嵐山じゃん 思えばけもフレでもよ 眼鏡が詰まってるのか ハ...

私事ですが、時差ぼけが治らなくて起きていられません。お休みなさい。

お名前 : コメント :


2009年02月27日 [長年日記] この日を編集

_ [最近]ToDo

プライベート方面のメモ.

優先度高

  • ポスター向けアブスト1枚
  • 眼鏡もろもろ
  • 金策(出入りのラグがw)

優先度中

  • Gauche/SICP 勉強会,前回まとめと,次回予定.3/21か3/28か.
  • TGM123 レポ

優先度低

  • セルチャレ(とりあえず,予選分は出したので)

お名前 : コメント :