Nanashi-soft○プログラマ専用○Windows gcc SDL○
Cellプロセッサは、メインとなる PPEが1基と、サブとなる SPEが8基から構成されています
SPE8基のうち、1基はオフになっており、1基は XMBメニューが使用していますので、使えるのは6基です
メイン CPUでサブ CPUに処理を割り振って高速化すると考えて下さい(もちろん他の手法もあります)
予め注意しておきますが、Cellは今までの CPUの考え方とは少し違った実装が行われています
理解できない人には非常に難しくて挫折する可能性が高いです。自信の無い人は手を出さない方が良いでしょう
メインCPUだけでも十分プログラミングは行えます。そして、速度が必要な箇所はライブラリとして SPEプログラムが配布されると思うので、あまり大きな問題にはならないでしょう
手順は、
1.SPE用プログラムを記述
2.SPE用にビルドして、実行ファイルを生成
3.PPEから SPE用実行ファイルを実行するプログラムを記述
4.PPE用にビルドして、実行ファイルを生成
5.PPE用プログラムをラン
という感じになります
1.SPE用プログラムを記述
まずは DMA転送とか難しい事を考えずに、PPEから SPEを実行してみます
単純に文字を標準出力するだけのプログラムを組みます
SPEは IOを持っていないのですが、標準出力だけは機能するようです
#include "stdio.h"
int main(unsigned long long spe, unsigned long long argp, unsigned long long envp){
printf("SPE run!!\n");
return 0;
}
2.SPE用にビルドして、実行ファイルを生成
spu-gcc -o spetest spetest.c
3.PPEから SPE用実行ファイルを実行するプログラムを記述
libspe2ライブラリを使用して、SPEを操作します
#include "SDL.h"
#include "libspe2.h"
int main(int args,char *argp[]){
//SPEプログラムロード
spe_program_handle_t *speopen=spe_image_open("./spetest");
if (speopen == NULL){
printf("spe_image_open error\n");
return -1;
}
spe_context_ptr_t specontext=spe_context_create(0, NULL);
if (specontext == NULL){
printf("spe_context_create error\n");
return -1;
}
if (spe_program_load(specontext, speopen) < 0){
printf("spe_program_load error\n");
return -1;
}
//SPEプログラムラン
spe_stop_info_t speret;
unsigned int speentry=SPE_DEFAULT_ENTRY;
if (spe_context_run(specontext, &speentry, 0, NULL, NULL, &speret) < 0){
printf("spe_context_run error\n");
return -1;
}
//SPEプログラム破棄
if (spe_context_destroy(specontext) < 0){
printf("spe_context_destroy error\n");
return -1;
}
if (spe_image_close(speopen) < 0){
printf("spe_image_close error\n");
return -1;
}
return 0;
}
4.PPE用にビルドして、実行ファイルを生成
普通にビルドすると
ppetest.c:(.text+0x24): undefined reference to `spe_image_open'
〜
collect2: ld returned 1 exit status
みたいなエラーがずらっと出ます
libspe2を使用する場合は -lspe2オプションが必要なようです
>ppu-gcc -m32 -o ppetest ppetest.c `sdl-config --cflags --libs` -lspe2
5.PPE用プログラムをラン
>./ppetest
プログラムが SPEで実行されて、「SPE run!!」と表示されるはずです
以上が最も基礎となる話です