1/66 >> First Last Hack the Cell
bitslice とは Hack the Cell '09 に参加して知った、Cellに限らず一般的に使えるビット演算の高速化手法について紹介します。 Bitslice と呼ばれる手法では、ビット順を90度回転します。言葉で説明するよりもコードを見たほうが早いので、回転させるコードの例を見てください int x[32], y[32]; // x が元のデータ、y が回転後のデータ. for (int i = 0; i < 32; ++i) { int t = 0; for (int j = 0; j < 32; ++j) t |= ((x[j] >> i) & 1) << j; // x[j] の i ビット目を y[i] = t; // y[i] の j ビット目にする } この変換をすることで、y[0] には x[0] - x[31] の最下位ビットが、 y[1] には 2番目のビット
Hack the Cell '09 に参戦していました。Fixstars社からの結果発表を待ってから成績報告をしようと思っていたのですが、他の参加者の皆さんがどんどんとスコアや素晴らしいテクニックを披露されているので、予定を前倒しして私のスコアとソースコードを公開します。(中身に関してはまた別の記事に書きます) 提出物とスコア ソースコード (試行錯誤の跡が整理されていません) スコア ORIGNAL: sum=3c927c56, 294030647 ticks MINE: sum=3c927c56, 4464381 ticks ORIGNAL: sum=2e987a4d, 424155603 ticks MINE: sum=2e987a4d, 6440068 ticks ORIGNAL: sum=ef1b6aef, 312102737 ticks MINE: sum=ef1b6aef,
普通に頭からビットを詰めていったら更新処理はこんな感じになります。 for (; count != 0; count -= 1) { <%= gen_update(0, 3, 4, 12, 12, "mask1") %> <%= gen_update(1, 4, 0, 12, 29, "mask2") %> <%= gen_update(2, 0, 1, 29, 29, "mask2") %> <%= gen_update(3, 1, 2, 29, 29, "mask2") %> <%= gen_update(4, 2, 3, 29, 29, "mask2", "mask3") %> } 例えば mt_bs[i][0] を更新するときは 396から523番目の入ったqwordとXORしないといけません。 これらはmt_bs[i][3]とmt_bs[i][4]にまたがっていて、前者からの11
_ TCO Algorithm Qualification Round 3 寝過ごした。 予戦落ちとかウケますね 忘れてた→酔っ払って寝てた→寝過ごした とか僕の能力を全て出し切った感じである。 その結果が予戦落ちなのだから、まぁ順当な結果なのだと思う。 (01:50) _ ぼくの村の話 http://www.fukkan.com/fk/VoteDetail?no=3761 復刊されたらしい。 らしいっていうか知らせが来るってことは なんかの拍子でリクエストボタン押したんだろうなぁ。 でも買わないと思うんだな。 読むと成田使いたくなくなるけど、 まぁなかなか使わないのも難しいよねというような。 (01:56)
みんなそうだと思うけど、even命令が大幅に過剰になっちまった。 しかも、僕のコードは1ワード1ロードシャッフル無しだから、それはもう多すぎて http://d.hatena.ne.jp/kikx/20090120 これはループのアンロール前で内側に14回のループが残ってたんだけど、 こんなんで44倍だったからアンロールしてoddに移動できるのを順番に移動してったんですよ。 (y >> 1) ^ mag01[y & 1] y << 7 y << 15これらは上から、 even*1 + odd*3 odd*1 odd*2を全部やってもまだ余ってて、しかたがないから y >> 11の半分くらいをodd*3で置き換えて、69倍速になったのです。 バイト単位じゃないともったいない。 z = si_lqx(spu_slqw(spu_gather(y), 4), mag_lut); r = spu_x
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く