Nanashi-softプログラマ専用Windows gcc SDL


◇PS3 Linux SDLでプログラミング -SPEでプログラムを走らせる-

○SPEとは?

Cellプロセッサは、メインとなる PPEが1基と、サブとなる SPEが8基から構成されています
SPE8基のうち、1基はオフになっており、1基は XMBメニューが使用していますので、使えるのは6基です

メイン CPUでサブ CPUに処理を割り振って高速化すると考えて下さい(もちろん他の手法もあります)

予め注意しておきますが、Cellは今までの CPUの考え方とは少し違った実装が行われています
理解できない人には非常に難しくて挫折する可能性が高いです。自信の無い人は手を出さない方が良いでしょう
メインCPUだけでも十分プログラミングは行えます。そして、速度が必要な箇所はライブラリとして SPEプログラムが配布されると思うので、あまり大きな問題にはならないでしょう

○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!!」と表示されるはずです

以上が最も基礎となる話です


TOPプログラマ専用PS3 Linux SDL