2009-03-01から1ヶ月間の記事一覧

MTの状態空間ワープ

ようするにnum_rand回のループなんだから、状態空間をnum_rand/2進んだ状態までワープさせてやれば、 0からnum_rand/2とnum_rand/2からnum_randを並列に計算できる。 と考えていた時期があって、色々と考えてみた。 行列の冪をlog(n)でやる例のアレ 一番最初…

Hack the Cell

優勝しますた。部屋を片付けてテレビ置く場所を作ります。

dddddmapとか作るとよくね?

http://d.hatena.ne.jp/ku-ma-me/20090312 を見て思ったんだけど、 x.ddmap.f ==> x.dmap.f.dmap x.dddmap.f ==> x.dmap.f.ddmap x.ddddmap.f ==> x.dmap.f.dddmapとか作れば x.map{|y|y*3/5+2}とかが x.dddmap*3/5+2ってできて便利じゃね。適当にこぴってき…

コード公開

http://as305.dyndns.org/~kik/public/mt_mine.c とりあえず置いてみた。実行環境がないんとasm化は大変だなあ。

懇親会

平日かー。行けるかなー。28日は行けるけど。

結果

ORIGNAL: sum=3c927c56, 292970508 ticks MINE: sum=3c927c56, 2313630 ticks ORIGNAL: sum=2e987a4d, 422626291 ticks MINE: sum=2e987a4d, 3328071 ticks ORIGNAL: sum=ef1b6aef, 310977433 ticks MINE: sum=ef1b6aef, 2454426 ticks ORIGNAL: sum=eedd251…

総和

sum = 0; for (i = 0; i < 16; i++) { s0 = cntb(y[i]); s1 = cntb(y[i+16]); s2 = sumb(s0, s1) sum += s2 << i; }以上。じゃなくて、ところどころシャッフルにしたけどね。herumiさんと同じでまとめてやろうとすると、gccがレジスタ割り当てに失敗して酷い…

これは偶然

これは本当に偶然で、そうである必然性はないはずなのですが、 12 + 29 * 4 = 128になります。この関係があるために、上の回転量は1と-4とか-1と4とかになります。この関係をうまく使って、最初から適当にずらしておきます。 下のほうのビット並び替えを使っ…

更新処理

普通に頭からビットを詰めていったら更新処理はこんな感じになります。 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…

ちょっとTemperingの話

本当は行列の計算を色々試してて気づいたんだけど y = y >> 1; y = y ^ (y >> 11);と y = y ^ (y >> 11); y = y >> 1;って、結果を見るとあまり差がないよね。ほんの少し正確に書くと word T1(word y) { return y ^ (y >> 11); }って関数を考える。T1の逆関…

ビット転置

69倍になったあとは、一ヶ月ずっとビット転置のやり方を考えてました。 ワード単位のときのような頭のおかしい配置方法があるんじゃないかと探してたんです。結局みつからなかったので、頭から順番にビットを詰めていく方法になりました。 qword mt_bs[32][5…

せっかくのgather命令

バイト単位じゃないともったいない。 z = si_lqx(spu_slqw(spu_gather(y), 4), mag_lut); r = spu_xor(spu_rlmaskqw(y,-1), z);これだと、ワード単位のgatherになっちゃって結果が4ビットしか得られないんですよ。 1命令使って、結果がたったの4ビットですよ…

Even命令が大幅に過剰

みんなそうだと思うけど、even命令が大幅に過剰になっちまった。 しかも、僕のコードは1ワード1ロードシャッフル無しだから、それはもう多すぎてhttp://d.hatena.ne.jp/kikx/20090120これはループのアンロール前で内側に14回のループが残ってたんだけど、 こ…

herumiさんのコードも読んだ。

革命的な方法はビット単位で計算したときにでてくるqwordの29ビット回転を1命令でやる方法です。 その話は次の次の次の次あたりかな。

擬似コード

謎の表の順番で更新すれば1ワード1ロードにできるのを擬似コードにしてみた。 ベクトル化はなし。 #define N 624 #define N 397 word mt[N]; word mtx[N]; void transform(word dst[N], word src[N]) { for (int i = 0; i < N; i++) { // 謎の表の通りに並び…

even*1+odd*3

(y >> 1) ^ mag01[y & 1]をeven*1+odd*3でやる話。XORはevenでやらないといけないから右シフトは当然qword右シフトになる。 mag01[y & 1] は gb してテーブルルックアップすることにすると z = si_lqx(spu_slqw(spu_gather(y), 4), mag_lut); r = spu_xor(sp…

最初の方法のベクトル化

昨日の謎の表は56行と余り8ワードあるので、56行を4分割してベクトル化するベクトルの最初のワードに、最初の14行を割り当てる // 0: 509-282- 55-452-225-622-395-168-565-338-111 // 1: 508-281- 54-451-224-621-394-167-564-337-110 // 2: 507-280- 53-45…

shinhさんのコードを見た

ということで次回は (y >> 1) ^ mag01[y & 1]をeven*1+odd*3命令でやる話

最初のやり方

// ---: 0- 1- 2- 3- 4- 5- 6- 7- 8- 9- 10 // 0: 509-282- 55-452-225-622-395-168-565-338-111 // 1: 508-281- 54-451-224-621-394-167-564-337-110 // 2: 507-280- 53-450-223-620-393-166-563-336-109 // 3: 506-279- 52-449-222-619-392-165-562-335-10…

ほんとはみんなちゃんと100倍超えてて

黙ってたりしてたりするんじゃないのか?とりあえずテレビを置くスペースを確保して待ってるか…

まだいじれるところもあるんだけど

まあこれでいっか。