v6.1がフィックスターズから公開されました。(?)ってのを使うとRSX(グラフィックボード)のVRAMの領域を使えるようになっているらしいのです。これで256MBの領域も使えるようになったので全部で512MBになった。これでも少ない気もするけどwそれにCellSsってのが入っているらしい。これは、自動で関数ごとの並列性を抽出して並列化してくれるものらしい。並列プログラムをかけない人には便利な機能かも。今度、時間があったらYDLをインストールしてみたいと思います。ppu-gcc等が使えるようになる俺だけじゃないと思うけどフルパスを指定しないと使用できない。spu-gccやppu-gccの場所は/opt/cell/toolchain/bin/にある。パスを指定してあげると簡単にgccのように使うことができる。コマンドを入力するとフルパスを入力しなくても利用できるようになる。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兆回の演算ができるって意味です。凄いというか、もうよくわからんです。週に7日間計算したとしてもRoadrunnerが1日で行う計算をするのに46年かかるという。ここにスパコンのランキングTOP500が載っています。Gene/Lを抜いて1位になった。Geneと同じIBM社のマシンなのね。Gene/Lが478.2TFLOPSとなっていて、Roadrunnerは1.026PFLOPSだから倍速くなったってことだ。有名なスパコンは神奈川にある地球シミュレータで以前、地球シミュレータの見学させてもらったため、若干思い入れがある。45TFLOPSと他のに比べると低いけど、2002年までは世界で一番速かったスパコン。PS3を使ってCellのプログラムを書いてるけど、なかなか難しいってのが印象。8i」ってのを搭載しているらしい。数値計算分野での使用を視野に入れてたんだったら最初から倍精度の演算を高速に処理できるCellを出してほしかった。DMA転送編DMA転送についてのアセンブリ編アセンブラでのDMA転送はチャネルにパラメータを書き込むことで実行できる。cmd);この関数とまったく同じ動作させるためにはチャネル16番から21番にパラメータを書き込む。チャネル16番はLSのアドレスチャネル17番はメインメモリのアドレスの上位アドレスチャネル18番は下位アドレスチャネル19番はDMA転送サイズチャネル20番はタグチャネル21番はDMA転送の種類(送信なら32、受信なら64)関数の引数順番ととチャネルの番号が対応しています。type)ではチャネル22番から24番まで書き込む。今回は、それぞれのレジスタ100番以降にパラメータが格納されていることということにしといてください。各レジスタの中身ついては、適当にお任せします。$ch24記述だけならこれだけ書けば動作します。値でいれるなら、それはそれで問題ない。パラメータは格納されているとしても各レジスタに全部入っていれば最短でこれだけ記述すればいい。アドレス計算なんかは、ローテートやシフト命令によって計算できるので、また機会があれば書きたいとは思います。その前に、ロード・ストアについても書いたほうがいいかな。コメントを残すDMA転送について(C言語)今回はCellで最も重要であるともいえるDMA転送についてSPEが参照できるのは自身のLSのみでありメインメモリは参照できない。DMA転送によってメインメモリからデータを転送する。DMA転送命令はspu_mfcdma64(32)mfc_getmfc_putなどがある。動作自体は同じなので問題ない。今回はspu_mfcdma64についてこの関数はこんな感じになっています。cmd);ls_addrはLSのアドレスes_hとes_lはメインメモリ側のアドレスでes_hはそのアドレスの上位32bites_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_writechspu_mfcstatってマクロと関数が定義されています。type)immはMFCに渡すチャネル番号を指定。MFC_WrTagMaskと書けば問題ない。(数値だと多分22かな?)raはタグの指定DMA転送時に指定したタグを、1bit左にシフトした値がタグマスクになります。typeはDMA転送の終了時にタグが更新されたかを確認します。MFC_TAG_UPDATE_ALLと書けばいい。これは上でセットした、タグマスクの完了を待つという意味。(数値で入力する場合、多分0,1,2のどれを入力したかで動作が変化すると思われる。今回の場合は2かな)詳細についてはフィックスターズのサイトをご覧ください。自分で定義したものなら、ともかくAPIとして定義されてるのは調べるのが面倒です。そのためC言語と違ってマクロや関数とかを使わないので、アセンブラのほうがシンプルです。次はアセンブリでのDMA転送について説明したいと思います。前回に浮動小数点演算について説明したのは除算のためでした。実数でないといろいろ問題があるんでSPUには除算命令ってのがありません。そのため、複数の命令を使って除算を実現します。後、浮動小数点を即値でロードする際ですが、0.5とか1.0とか入力しても駄目です。(何かやる方法があればなぁと思い調査中)通常(コンパイラ)は、浮動小数点で表した数値と同じbit配置の数値で入力しています。これも、前もって説明しておけばよかったと反省。今回は、そんな細かいことは無視して実数をそのまま入力するようにします。その方が分かりやすいので。一度簡単なプログラムを見せてから説明したほうが早いと思うので、とりあえず見てください。$8,$5,$7ってな感じで、答えは$8に入ります。今回は、レジスタ5に1.0を、レジスタ6に0.4をロードしました。frestですが、これは0.4の逆数を求めています。この計算では若干精度が悪いといった問題があります。そこでfiという命令を使ってより精度の高い逆数を求めます。$6には元々の実数の値を、$7にはfrestで求めた逆数を入力します。逆数を求めた結果が$7に格納されます。fmは前回にも説明した浮動小数点の乗算命令です。(1/b)を計算しているんですね。4にもないと聞きました。)そのため、逆数を求めるテーブルってのがありまして、そこから逆数の値を求めます。それだと精度が悪いため、ニュートンラプソン法を使って、より精度の高い値に収束させます。それなりの値を初期値を入力しているので1回でも、精度の高い値に収束するみたいです。このように、精度の高い逆数を求めるのが、fi命令だと思われます。これを複数回行えばより精度の高い値も出せそうですが1回でも十分な結果は得られます。要は実数とだけ思っていただければ問題ないです。細かいことは自分で調べてみてください。乗算という感じで、特に整数値の時の命令とレジスタの使い方は大きく変わりません。命令も先頭に「f」がついて、最後の方の文字が減ってる感じです。前回のおまけ的な感じで減算と乗算について説明します。$5と、それぞれ$6に演算結果がはいる。浮動小数点演算は計算できません。浮動小数点演算の命令に関しては機会があれば書きたいと思います。今回の命令はワード(32bit)の演算なのでハーフワードでは命令も異なります。8をインストールしてからほとんど何もしてなかったけど最近勉強を始めたので少しずつ復習のつもりで書いていきたいと思います。簡単な命令を説明する前の表記法と規則について説明しておきます。Specificationを読んでください。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ビットの正の値のみ。同じビット数で正の値しか使わないなら符号なしの方がより大きい値を使用することが可能。$5とすると、$3に演算結果が入ります。$4,2とすれば、上の演算と同じ結果が入ります。この段階ではレジスタに格納されただけでLS上には格納されてはいないので注意してください。