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 ってコマンドを入力すると
フルパスを入力しなくても利用できるようになる。

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上には格納されてはいないので注意してください。

システムソフトウェア2.1 の不具合 kbootが起動しない

PLAYSTATION®3 Linux Information Siteでの記事で載っていましたが、
PS3のシステムソフトウェア2.1をインストールしてから
20071023版のADDON (Distro Kit 1.5.0)に含まれるLinuxカーネルのkbootが起動しないという問題が発生しているそうです。

すでにFedora 8をインストールしているので問題ないけど
知り合いが、kbootがおかしいと調べてみたらこんな記事があった。
ただkboot自体が動作していたがLinux(Fedora 8)が起動しなった。
これとは別の問題かもしれないけど。

不具合が直るまでは先にkbootをインストールしてからアップデートをした方がいいです。

追記
20071220版のADDON CD が公開されこれなら問題は解消しているそうです。

CellSDKのインストール (Feora 8編)

PS3のHDDをフォーマットしてしまったので、
改めてCellSDKをインストールすることに

もともとSDK3.1はFedora 7用なのでちゃんとインストールできるか怪しいもんですが、
まぁ互換性あるだろ程度の甘い考えで挑戦。
ってかFedora 8をいれた時点でどの道避けられないし。

何かインストールする時
ライセンス承諾みたいのが出てたんだけど、
今まであったかな~確かなかったような~
それに、サポート外だとかなんか最初に警告みたいなのがあった。
OSが違うからな~まぁここはしょうがない。
とりあえず承諾するしかない。
駄目だったら、Fedora7に戻すまでだ。

正直な話、コンパイラとかライブラリなんかが
入ってればいい話しなので
別にシミュレータを入れる必要が無いw

どうしても、シミュレータを入れたいって人は良いけど
俺はもうX立ち上げてフリーズするのが嫌なので、
シミュレータを起動することはないだろう。

ただ、パッケージを集めるのが面倒だから
シミュレータを入れてるだけw

PS3でシミュレータなんて多分、いや絶対動かない。
確実にフリーズする。
これから入れようとする人もシミュレータを起動させるのはやめたほうがいい。

実際、Fedora Core6のときに起動させたけど。
重いし、クソ遅い。
恐らくPPEだけでシミュレータを動作させてるからだろう。
CellのシミュレータなのにSPEを使えないってw
(もちろん、昔の話だから今はどうなのかは分からないけど)
それなら実際にCellで動かしたほうがいい。

それにシミュレータの推奨スペックが512MBぐらいは必要だったような・・・
どの道、X立ち上げたら重いし、
どうしてもシミュレータを起動させたい人は、
別途メモリを大量に搭載したPCを用意してやったほうが良いと思います。

一応、インストールは無事完了して、一通りちゃんと入ってます。
とりあえず問題なさそうです。
今も、今後も含めシミュレータは起動させるつもりはありませんので、そこは未確認まま。