スキップしてメイン コンテンツに移動

投稿

ラベル(Cell)が付いた投稿を表示しています

そろそろ知ってもいいんじゃないかな、PS3がどれだけ凄いかを

一年以上前に、 PLAYSTATION 3を購入 した。このときは、Cellでアレゲに遊ぶぐらいのつもりだったのだが、どうしてどうして、PS3がここまで凄いとは。これは嬉しい誤算だった。ここ数年で買ったものの中でもっとも満足度の高い製品だ。そして、こんなに素晴らしいものを多くの人は知らないで(もしくは マスコミなどの偏見 に騙されて)、使わずにいるなんて損をしているなぁ、と思ってしまうのだ。 ここではPS3の良さを述べているわけだが、私は別にソニー製品のファンというわけではないし、基本的にメーカーにはこだわらない方だ。良いものは良いし、悪いものは悪いのである。現在使っているノートPCはPanasonicだし、ヘッドホンはBoseだし、ディスプレイは三菱で、デスクトップPCはBTOだ。ゲーム機にしたって任天堂製品も使っている。節操がないようにも見えるかもしれないがそれぞれ自分なりに吟味して選んだものばかりなのだ。例えば、ノートPCはNEC、ソニー、Dellなどを使ってきているし、ヘッドホンもいろいろと購入している。BTOのPCにしても複数のショップから購入してどの店はどの点が良くてどの点が悪いのかを自分なりに分析している。とにかく自分で多くの製品を使ってみて、納得の行く本当に良いものだけを残すようにしているのだ。もちろんそのときは最高のものだと思っていても後でより良いものが出てきたりするわけだが。 しかし、世の中の多くの人々が、マスコミやネットの情報に踊らされ、自分では何一つ確かめていないのに、さも知っているかのような感覚に囚われ、良いものを悪く、悪いものを良く感じてしまう。しかも、悪いものしか知らないから本当に良いものが理解できないのだ。これは何もPS3に限ったことではなく、自分の周りだけ見ても様々なレベルで日常茶飯事に起こっていることだ。まずは、周りの情報に踊らされることなく、自分の目、耳、手を使って情報を集めて欲しい。本当に良いものが埋もれてしまうのはすべての人の不幸である。 もっとも、PS3に限っていえば、埋もれてしまうことはなさそうだ。出だしは芳しくなかったPS3も、ゲームソフトなどが充実し、安価になってきて、良さがだんだんと伝わり始めたようで、ここのところの 売り上げは好調 らしい。別にPS3が売れたからといって自分にとっては直接の益があるわ...

複数のSPEを利用したCellプログラムの雛形

入力データ in を複数のSPEに割り当てて処理を行う。結果は出力データ out に格納される。 program_ppe.c /* ppu-gcc -lspe2 -lpthread program_ppe.c -o program_ppe */ #include <stdio.h> #include <libspe2.h> #include <pthread.h> #define SPE_PROGRAM "program_spe" #define NUM_SPE 4 #define SIZE (10000) #define DMA_BY_TYPE (16) /* (16) for char, (4) for int */ typedef struct { unsigned long long ea_in; unsigned long long ea_out; unsigned int size; int pad[3]; } params_t; params_t params[NUM_SPE] __attribute__((aligned(16))); typedef struct { spe_context_ptr_t spe; params_t *params; } thread_arg_t; void *run_spe(void *thread_arg) { int ret; thread_arg_t *arg = (thread_arg_t *)thread_arg; unsigned int entry; spe_stop_info_t stop_info; entry = SPE_DEFAULT_ENTRY; spe_context_run(arg->spe, &entry, 0, arg->params, NULL, &stop_info); return NULL; } void process_spe(unsigned char *in, unsigned char *out) { int i; int size, spe_s...

SPE用SIMD演算を利用した大文字変換プログラムにバグ

フィックスターズ の 3.7 演習問題 (3-2) 大文字変換プログラム の 解答 で示されたSPE用ソースコードにバグがあることを見つけた。 小文字を大文字に変換する単純なプログラムで、サンプルの文字列、"A Quick Brown Fox Jumps Over The Lazy Dog.\0"だと問題ないように見えるが、代わりに"Linux\0"を処理すると、"LINUW"と表示されてしまう。 SPE用ソースコード内の小文字を大文字に変換する部分を以下に示すが、赤字で示すコードが誤りだ。 vpata = spu_cmpgt(va, vin[i]); vpatz = spu_cmpgt(vin[i], vz); vpat = spu_or(vpata, vpatz); vout_upper = (vector unsigned char) spu_sub((vector unsigned short) vin[i], (vector unsigned short) voffset); vout[i] = spu_sel(vout_upper, vin[i], vpat); 無理やりvector unsigned charからvector unsigned shortにキャストしてvoffset(0x20)の引き算を行っているが、これだと、"Linux\0"は"Li", "nu", "x\0"となり、それぞれから"0x20, 0x20"を引くことになる。上位の桁と下位の桁で繰り下げがなければ問題がないが、繰り下げがあると上位の桁に影響が出てきてしまうのである。"Li", "nu"は繰り下げは起きないが、"x\0"の場合、"0x78, 0x00"からそれぞれ0x20を引くわけで、"0x57, 0xe0"となる。0xe0は小文字の文字コード範囲から外れているので無視されるが、0x57は"W"として認識される。よって、出力が"LINUW"となってしまうのだ。...

gccからppu-gccに変更したらAltiVecを利用したSIMD演算でエラー

フィックススターズ の Cellプログラミングチュートリアル は初めてPS3でCellのプログラムを作るのには丁度良い内容と分量になっている。それほど難しいことは無く、基本を習得できるのだ。しかし、この記事を書いている時点では、最終更新日が2007å¹´2月2日と、内容が若干古い。 PPE用のプログラムもすべてgccでコンパイルするようになっている。PPE用のプログラムはppu-gccを利用したほうがCell用に最適化してくれるので実行効率が良い。なので、gccでコンパイルされているところはすべてppu-gccにすればよいのだが、実はこのチュートリアルではそれではエラーが出てしまうのである。 たとえば、SIMDを使った 条件分岐の削除 にあるプログラムだが、これをppu-gccでコンパイルすると、 error: incompatible types in assignment と、エラーが出る。これは vpat = vec_cmpgt(va[i], vb[i]); に示すコードの返り値の型が一致していないことが原因である。なので、 vector unsigned int vpat; の部分を、 vector bool int vpat; のように変更する必要がある。 別のソースコードも似たようなエラーが起こるが、ほとんどが型の不一致が原因なので、宣言の型を変更したり、目的の型にキャストすればエラーは解消される。