PS4の話(例1, 例2)もすでにいろいろ出ている中で、新しいPS3が発表されました。
高性能なゲーム機あるいはBDプレーヤーを求めている方には朗報なのでしょうが、私にとっては少し残念なニュースです。
新しいPS3では、「他のシステムのインストール」ができないそうです(参考)。「PS3でGNU/Linux、何するの?」の答えの一つ試すことはできなくなるのです(公式には)。高速、高画質H.264ソフトウェアエンコーダ for PS3のようなものを作るのも難しくなるでしょう。
PS3に最適化した単精度計算プログラムの性能は、Core i7のような最新のCPUを超えています。PS3の発売時期を考えると驚異的なことです。簡単な例を紹介しましょう。単純な行列のかけ算です(C++で使っているものから抜き出したので、C言語なのにmatrix_mul_blas.ccです)。
#include <stdio.h> #include <stdlib.h> #include <math.h> #ifdef __PPU__ #include <blas.h> #include <malloc_align.h> #endif //単精度の場合 typedef float Number; #define GEMM sgemm_ //倍精度の場合 //typedef double Number; //#define GEMM dgemm_ #ifndef _PPU__ extern "C" int GEMM(char*, char*, int*, int*, int*, Number*, Number*, int*, Number*, int*, Number*, Number*, int*); #endif int main(int argc, char** argv){ int SIZE=atoi(argv[1]); int REPEAT=atoi(argv[2]); #ifdef __PPU__ Number* A=(Number*)_malloc_align(sizeof(Number)*SIZE*SIZE, 7); Number* B=(Number*)_malloc_align(sizeof(Number)*SIZE*SIZE, 7); Number* C=(Number*)_malloc_align(sizeof(Number)*SIZE*SIZE, 7); #else Number* A=(Number*)calloc(SIZE*SIZE, sizeof(Number)); Number* B=(Number*)calloc(SIZE*SIZE, sizeof(Number)); Number* C=(Number*)calloc(SIZE*SIZE, sizeof(Number)); #endif char transa='n'; char transb='n'; int size=SIZE; Number alpha=1; Number beta=0; int i, j; for (i=0; i<SIZE; ++i){ for (j=0; j<SIZE; ++j){ A[i+SIZE*j]=10*i+j; B[i+SIZE*j]=1000*i+100*j; } } for (i=0; i<REPEAT; ++i) GEMM( //alpha A B + beta Cを計算する &transa, //Aを転置、共役転置するかどうか('n', 't', or 'c') &transb, //Bを転置、共役転置するかどうか('n', 't', or 'c') &size, //AとCの行数 &size, //BとCの列数 &size, //Aの列数=Bの行数 &alpha, //A*Bにかける定数 A, &size, //Aの第1次元('n'ならmax(1, m)以上) B, &size, //Bの第1次元('n'ならmax(1, k)以上) &beta, //Cにかける定数 C, &size //Cの第1次元(max(1, m)以上) ); //メモリの解放を省略 return 0; }
参考:Lapackの使い方
Core 2 Quad Q6600 (2.4GHz)を使って、「g++ -O3 matrix_mul_blas.cc -lblas」とコンパイルして実行すると、8.2 GFlopsくらいになりました(行列サイズは2048、倍精度だと4.2 GFlopsくらい)。Core 2 Quadの性能はもっと高いのですが、ふつうにインストールされるBLASでの行列のかけ算はコアを1つしか使わないのでこんなものでしょう。
Core i7 940 (2.93GHz)とIntel Math Kernel Libraryを使って、「icc -O3 matrix_mul_blas.cc -lmkl_em64t -lmkl -lguide -lpthread」とコンパイルして実行すると、90 GFlopsくらいになりました(行列サイズは2048、倍精度だと44 GFlopeくらい)。
PS3を使って、「ppu-g++ -O3 -I/opt/cell/sdk/usr/include matrix_mul_blas.cc -lblas」とコンパイルして、「export BLAS_NUMSPES=6」のようにSPE数を設定してから実行すると、125 GFlopsくらいになりました(行列サイズは1920、倍精度だと7.5 GFlopsくらい)。Core i7より速いです。
このような計算資源が、ユーザの手の届かないところに行ってしまいます。
速いPCを買えばいいと思う人もいるかもしれません。確かに、ここで紹介した計算資源の問題はそれで解決してもいいでしょう。しかし、CELLというちょっと変わったアーキテクチャのためのプログラムを書く喜びは、簡単に替えられるものではありません。
紐付きアプライアンスなんか要らないという向きは、在庫があるうちに旧型を入手しておいた方がいいかもしれません。
追記:SCEの吉増一氏によれば、旧型から「他のシステムのインストール」機能が排除されることはないそうです。
吉増氏:基本的には、PS3専用のソフトウエアを利用していただきたい、ということです。PS3はすでに2,000万台出荷しています。今後も、それらのモデルでOther OSインストールの機能を排除することはありませんので、そのままお使いいただけます。(SCEに聞く、薄型PS3とソフトウエアVer.3.00の秘密)
こんにちは。値下げと聞いて、真っ先に自宅の計算サーバにしようと思った直後に残念な思いをした者です。
PS3が非常に面白いおもちゃであるという点は同意します。
また、単精度の計算能力が非常に高いことについても異論はありません。
その一方で、この記事では以下の理由により他のアーキテクチャの評価が不当に低くなっています。
(1) BLAS3の演算という原理アーキテクチャの理論ピーク性能を出しやすいベンチマークであることにより、他のCPUの性質、たとえばキャッシュのサイズや分岐予測の精度などが無視されている。特に、Cellの場合は、PPEが一個なのでマルチタスクには不安が残る。
(2) Q6600で使用しているBLASがおそらくシングルスレッドのものである(過去に、というかこの春までBLASの研究をしてましたが、それによると倍精度でも20GFLOPS程度まで出ることが実証済み)
また、こちらの実験結果としては、Core i7においてHyper-threadingが有効/無効によって性能は10%程度は変化します。この場合はおそらく、Hyper-Threadingを無効にしているデータだと思いますが。
何が言いたいかといえば、確かにCell/PS3は面白いのですがすでに時代遅れの感が否めないのです。
Cellを扱うにせよ、すでに倍精度を高速化したモデルも出ていますし、Cell以外のアーキテクチャも(Cellとは違う方向にですが)進化しています。GPUも日進月歩の世界です。
その中で、今現在からPS3で遊びだすというのは、いまさらPentiumで遊びだすのと同じくらいの価値しか無いと思います。
もちろんそこから得られるものがあることは否定しませんし、重要なことですけども。
補足というか、誤解を避けるために書いておきますと、
> Core i7においてHyper-threadingが有効/無効によって性能は10%程度は変化します
これは、無効のほうが有効の場合よりも速いということです。数値計算系の問題では、一般的に無効のほうが速くなります。
一方、探索系の問題では有効のほうが速くなります。
yuta sawaさん
コメントありがとうございます。
比較が「不当」とのことですが、使っているのが、
yum等でふつうにインストールできるものはそれを使う
ということで、条件を揃えてはいるのです。
とはいえ、Q6600の性能がとても低いと誤解されそうなので、
コメントを付記しました。
ちょっとずるしているのは、
行列のサイズをPS3で最高性能が出るあたりにしていることですが、
たとえ細かいチューニングをしたとしても、
「単精度ならPS3はCore i7に匹敵する」
ということは言えるだろうと思います。
BLASが、PS3の性能をアピールするための
よい例かどうかは議論があるでしょうが。
PS3で計算して遊ぶことが旬ではないと言われれば、
たしかにそうかもしれませんね。
それでも、あえて機能を省くことはないんじゃないかと思うのです。