YDL 6.1が公開されました

Yellow Dog Linux v6.1が
フィックスターズから公開されました。

YDL v6.1が何がすごいかと言うと、
ps3vram (?)ってのを使うとRSX(グラフィックボード)の
VRAMの領域を使えるようになっているらしいのです。
これで256MBの領域も使えるようになったので
全部で512MBになった。
これでも少ない気もするけどw

それにCellSsってのが入っているらしい。
これは、自動で関数ごとの並列性を抽出して並列化してくれるものらしい。
並列プログラムをかけない人には便利な機能かも。

今度、時間があったらYDLをインストールしてみたいと思います。

bashにspu-gccのパスを設定する

Cell SDKをインストールすると
spu-gcc ppu-gcc等が使えるようになる

俺だけじゃないと思うけど
フルパスを指定しないと使用できない。
spu-gccやppu-gccの場所は
/opt/cell/toolchain/bin/にある。
パスを指定してあげると簡単にgccのように使うことができる。

ホームディレクトリに
.bash_profileってファイルがあるから
そのファイルに
export PATH=$PATH:/opt/cell/toolchain/bin/
って記述を追加するだけ

保存したら
source .bash_profile ってコマンドを入力すると
フルパスを入力しなくても利用できるようになる。

ThinkPad T61にFedora 9(32bit版)を入れなおした

64bit版はflashが入らなかったり、
Cell SDKもインストールできなかったりして
まだまだ64bitは早かったみたい。

なので、32bit版を入れなおしてみた。
flashもちゃんと入ってopenofficeも入った。

ただ、ちょうどこの時期に
CellSDK3.1が出て
インストール方法が分からず
(英語読む気が起きなくて)
まだ入れてない。

問題は、
カーネルを入れたあたりで、
解像度が1440×900かそれ以下しか選べず
1400×1050が設定できない。
グラボのドライバを入れたけど、
改善されずどうしていいかわからない。

けど、今までできなかった
サスペンドからちゃんと復帰はできるようになった。

作業できないことはないので、
気長に解決策を練ることにします。

Cellを搭載したRoadrunnerがスパコン世界1位に

Cellを搭載したスパコン「Roadrunner」が
1PFLOPSを実現したそうです。

Cellが1万3000個近く搭載されていて4GHlzで動作するそうです。
PS3は約3.2GHlzなので、より高速なCellみたいです。

1PFLOPSは1秒で1000兆回の演算ができるって意味です。
たった1秒の間に1000兆回とか未知というか、
こうやっている間にも、何兆、何京といった凄まじい演算を行っていることが、
凄いというか、もうよくわからんです。

なんでも
地球上の60億人すべてが電卓を使って1日24時間、
週に7日間計算したとしても
Roadrunnerが1日で行う計算をするのに46年かかるという。
現実離れしすぎてる。

ここにスパコンのランキングTOP500が載っています。
今まで3年間もスパコンのランキングでトップだった
Blue Gene/Lを抜いて1位になった。
っても、結局Blue Geneと同じIBM社のマシンなのね。
ってかトップ10のなかにIBMのマシンが5台って、IBMってすげ~

wikipediaによると
Blue Gene/Lが478.2TFLOPSとなっていて、
Roadrunnerは1.026PFLOPSだから倍速くなったってことだ。

日本で一番速いのが
T2Kオープンスパコン東大版(?)ってので140TFLOPS
Blue Gene/Lの約半分。
多分、日本で一番有名なスパコンは神奈川にある地球シミュレータで
以前、地球シミュレータの見学させてもらったため、若干思い入れがある。
45TFLOPSと他のに比べると低いけど、
2002年までは世界で一番速かったスパコン。

PS3を使ってCellのプログラムを書いてるけど、
なかなか難しいってのが印象。
Roadrunnerのプログラミングってもっと難しいんだろうな~

数値計算で倍精度の浮動小数点演算って大体必要になってくることが多いけど
Cellは倍精度の演算は苦手だって聞いてたから
どうしたのかと思ってみたけど、
PCWatchの記事で倍精度の浮動小数点演算を強化した
「PowerXCell 8i」ってのを搭載しているらしい。

だったら、数値計算分野での使用を視野に入れてたんだったら
最初から倍精度の演算を高速に処理できるCellを出してほしかった。

にほんブログ村 PC家電ブログ パソコン・周辺機器へ応援お願いします。

Cellのお勉強 DMA転送編

DMA転送についてのアセンブリ編

アセンブラでのDMA転送は
チャネルにパラメータを書き込むことで実行できる。

前回、DMA転送の関数
void spu_mfcdma64(volatile void *ls_addr,
                                       unsigned int ea_h,
                                       unsigned int ea_l,
                                       unsigned int  dma_size,
                                       unsigned int tag_id,
                                       unsigned int cmd);

この関数とまったく同じ動作させるためには
チャネル16番から21番にパラメータを書き込む。

チャネル16番はLSのアドレス
チャネル17番はメインメモリのアドレスの上位アドレス
チャネル18番は下位アドレス
チャネル19番はDMA転送サイズ
チャネル20番はタグ
チャネル21番はDMA転送の種類(送信なら32、受信なら64)
関数の引数順番ととチャネルの番号が対応しています。

spu_writech(imm, 1 ra);
spu_mfcstat(unsigned int type)
では
チャネル22番から24番まで書き込む。
チャネル22番はタグマスク
(チャネル20番に書き込んだタグの値の左に1bitシフトした値)
チャネル23番はタグステータスの更新リクエストの書き込み
( 0なら無条件、1ならどれか一つでも完了していれば更新、2なら全部が終了したら更新)
チャネル24番はタグステータスを読み込み

書き込み命令と読み込み命令は
wrch   ch,    ra
rdch    rt,     ch

ロードストアとか細かな命令について全く説明してなかったので
アドレス計算とかは、また今度と言うことで・・・
今回は、それぞれのレジスタ100番以降にパラメータが格納されていることということにしといてください。
各レジスタの中身ついては、適当にお任せします。

wrch   $ch16,   $100
wrch   $ch17,   $101
wrch   $ch18,   $102
wrch   $ch19,   $103
wrch   $ch20,   $104
wrch   $ch21,   $105

wrch   $ch22,   $106
wrch   $ch23,   $107
wrch   $2,         $ch24

記述だけならこれだけ書けば動作します。
タグの値何かは、
ビットシフトなのでレジスタの値をいじるか、
即値でいれるなら、それはそれで問題ない。
なので、パラメータは格納されているとしても各レジスタに全部入っていれば
最短でこれだけ記述すればいい。

アドレス計算なんかは、ローテートやシフト命令によって計算できるので、
また機会があれば書きたいとは思います。
その前に、ロード・ストアについても書いたほうがいいかな。

DMA転送について(C言語)

今回はCellで最も重要であるともいえるDMA転送について
SPEが参照できるのは自身のLSのみであり
メインメモリは参照できない。

DMA転送によってメインメモリからデータを転送する。
DMA転送命令は
spu_mfcdma64(32)
mfc_get
mfc_put
などがある。

まぁどれがいいのかってのは分からないけど、
動作自体は同じなので問題ない。
今回はspu_mfcdma64について
この関数はこんな感じになっています。
void spu_mfcdma64(volatile void *ls_addr,
                                       unsigned int ea_h,
                                       unsigned int ea_l,
                                       unsigned int  dma_size,
                                       unsigned int tag_id,
                                       unsigned int cmd);

ls_addrはLSのアドレス
es_hとes_lはメインメモリ側のアドレスで
es_hはそのアドレスの上位32bit
es_lは下位32bitとなる。
mfc_ea2h()マクロとmfc_ea2l()ってのが用意されているから
64bitで渡されたアドレス(addrとすると)
mfc_ea2h(addr)マクロとmfc_ea2l(addr)とすると
自動的に上位bitと下位bitに分けてくれる。

dma_sizeはDMA転送サイズを指定する。
DMA転送のサイズは
1,2,4,8,16byteまたは16byteの倍数で最大16kBとなっています。

tag_idはDMA転送のタグをしています。
転送するにあたって問題はないけど、同期をとるときに使用します。

cmdはDMA転送の種類を指定します。
細かいのはよく分からないので
(SPEから見て)送信の場合は32
受信の場合は64を入力します。

一応、MFC_GET_CMDやMFC_PUT_CMDでも送信受信の指定ができます。

同期を取るために
spu_writech
spu_mfcstat
ってマクロと関数が定義されています。

spu_writech(imm, 1 ra);
spu_mfcstat(unsigned int type)

immはMFCに渡すチャネル番号を指定。
MFC_WrTagMaskと書けば問題ない。(数値だと多分22かな?)
raはタグの指定
DMA転送時に指定したタグを、1bit左にシフトした値がタグマスクになります。

typeはDMA転送の終了時にタグが更新されたかを確認します。
MFC_TAG_UPDATE_ALLと書けばいい。
これは上でセットした、タグマスクの完了を待つという意味。
(数値で入力する場合、多分0,1,2のどれを入力したかで動作が変化すると思われる。
0なら無条件、1ならどれか一つでも完了していれば、2なら全部が終了したら・・・
今回の場合は2かな)
詳細についてはフィックスターズのサイトをご覧ください。

自分で定義したものなら、ともかくAPIとして定義されてるのは調べるのが面倒です。
そのためC言語と違ってマクロや関数とかを使わないので、
アセンブラのほうがシンプルです。
次はアセンブリでのDMA転送について説明したいと思います。

Cellのお勉強 除算編

前回に浮動小数点演算について説明したのは除算のためでした。
実数でないといろいろ問題があるんで

SPUには除算命令ってのがありません。
そのため、複数の命令を使って除算を実現します。

後、浮動小数点を即値でロードする際ですが、0.5とか1.0とか入力しても駄目です。
(何かやる方法があればなぁと思い調査中)
通常(コンパイラ)は、浮動小数点で表した数値と同じbit配置の数値で入力しています。
これも、前もって説明しておけばよかったと反省。
今回は、そんな細かいことは無視して実数をそのまま入力するようにします。
その方が分かりやすいので。

除算プログラムですが、
一度簡単なプログラムを見せてから説明したほうが早いと思うので、
とりあえず見てください。

a = 1.0
b = 0.4
c = a / b を考えます。

il            $5   1.0
il            $6.  0.4
frest      $7,$6
fi            $7,$6,$7
fm         $8,$5,$7

ってな感じで、答えは$8に入ります。
ilってのは単にロードで、
今回は、レジスタ5に1.0を、レジスタ6に0.4をロードしました。
frestですが、これは0.4の逆数を求めています。
つまり、1/0.4です。
しかし、この計算では若干精度が悪いといった問題があります。
そこでfiという命令を使って
より精度の高い逆数を求めます。
$6には元々の実数の値を、$7にはfrestで求めた逆数を入力します。
逆数を求めた結果が$7に格納されます。

fmは前回にも説明した
浮動小数点の乗算命令です。
要は
c = a * (1/b)
を計算しているんですね。

なんで、除算をするのにこんなことをしているのか
これはちょっと、自分も自身はないのですが、
コンピュータには割り算命令がないってのは、最初に説明しましたが
(全部がそうとは限らない(?)自分も分からないのですがPentium 4にもないと聞きました。)

そのため、逆数を求めるテーブルってのがありまして、
そこから逆数の値を求めます。
でもそれだと精度が悪いため、
ニュートンラプソン法を使って、より精度の高い値に収束させます。
恐らく一回しか、計算してないようですが・・・
元々、それなりの値を初期値を入力しているので
1回でも、精度の高い値に収束するみたいです。
このように、精度の高い逆数を求めるのが、fi命令だと思われます。
これを複数回行えばより精度の高い値も出せそうですが
1回でも十分な結果は得られます。

Cellのお勉強 浮動小数点演算編

浮動小数点とは、
コンピュータの中で実数(小数点)をどのように表現するかの方法で
固定小数点、浮動小数点の2種類がある。
要は実数とだけ思っていただければ問題ないです。
まぁ細かいことは自分で調べてみてください。
実数の加算・減算・乗算は
整数値の場合のときの命令がちょっと変わっただけの

fa      rt,   ra,   rb      加算
fs      rt,   ra,   rb      減算
fm     rt,   ra,   rb      乗算

という感じで、特に整数値の時の命令とレジスタの使い方は大きく変わりません。
命令も先頭に「f」がついて、最後の方の文字が減ってる感じです。

Cellのお勉強 減算・乗算編

前回のおまけ的な感じで
減算と乗算について説明します。
除算はちょっと特殊なのでまたの機会に・・・

減算は
sf   rt,   ra,   rb

乗算は
mpy   rt,   ra, rb

c = a-b,   c=a*bを考えると
a = 1,   b = 2だとすると
li        $4,   1
li        $5,   2
sf       $6,   $4,   $5

li         $4,   1
li         $5,   2
mpy   $6,   $4,   $5

と、それぞれ$6に演算結果がはいる。

ここで注意して欲しいのが
sf, mpyも整数同士の演算用の命令なので、
浮動小数点演算は計算できません。
浮動小数点演算の命令に関しては機会があれば書きたいと思います。
また、今回の命令はワード(32bit)の演算なのでハーフワードでは命令も異なります。

Cellのお勉強 加算編(アセンブリ)

PS3にFedora 8をインストールしてから
ほとんど何もしてなかったけど
最近勉強を始めたので少しずつ復習のつもりで書いていきたいと思います。

簡単な命令を説明する前の表記法と規則について説明しておきます。
詳しくはSony Computer Entertainment Inc.より
SPU Assembly Language Specificationを読んでください。

命令の例として
li      rt,   ra,   rb,     rc

ってのがあった場合、
liは命令
rtはターゲットレジスタ。大体はここに演算結果が入る。
演算結果をストアするときには逆になる。
ra,rb,rcはソースレジスタ。これらは演算するときに参照するレジスタとなる。
Cellにはレジスタが128個あります。
レジスタは$で指定して0~127まで使えます。

また、
s3,6,7,10,11,14,16は各ビットの符号拡張される値。
s16の場合、16ビットの値で、正負のどちらも入る。
u7,14,16,18は各ビットの符号なしの値。
u18だと、18ビットの正の値のみ。
同じビット数で正の値しか使わないなら符号なしの方が
より大きい値を使用することが可能。

liは即値のロードで
li   rt,   s16    となっています。
aはワードの加算
a   rt,   ra,   rb

なので、
s = a + bとして
s = 1+2なら

li   $4,   1
li   $5,   2
a   $6,   $4,   $5

とすると、$3に演算結果が入ります。
ちなみに
aiはレジスタの値と即値の加算なので、
計算の値が定数値ならば
li   $4,   1
ai  $6,   $4,2
とすれば、上の演算と同じ結果が入ります。

まだ、この段階では
レジスタに格納されただけで
LS上には格納されてはいないので注意してください。