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


◇PS3 Linux SDLでプログラミング -SPEからメインメモリに書き込む-

○読み込みと基本は同じ

今まで読み込み方法ばかりを説明してきましたが、書き込む方法も基本は同じです
spu_mfcdma64の引数を MFC_GETL_CMDと書くか、MFC_PUTL_CMDと書くかの違いだけです

○プログラム

data1を読み込んで、2倍してみます
尚、このプログラムは libspe 2.0.1用です

・PPE側の処理
SPEから配列を2つ読むと全く同じですので、そちらを見てください
但し今回は、最後にprintfでdata1の中身を表示して、2倍になっている事を確認します

〜省略〜
    int i;
    for(i=0; i < sizeof(data1); i++){
    printf("data1:%d\n", data1[i]);
  }

  return 0;
}


・SPE側の処理
data1を読み込む所までは同じで、計算後に spu_mfcdma64関数のモードを PUTLに変えて戻します
エレメントを触っていない所がポイントです

#include "stdio.h"
#include "spu_mfcio.h"

unsigned long addrlist[2] __attribute__((aligned(16)));

unsigned char data1[64] __attribute__((aligned(16)));

int main(unsigned long long spe, unsigned long long argp, unsigned long long envp){
  //まずは、アドレスリストを取得
  mfc_list_element_t element[1];
  element[0].notify = 0;
  element[0].reserved = 0;
  element[0].size = sizeof(addrlist);
  element[0].eal = mfc_ea2h(argp);

  int tag=3;
  spu_mfcdma64(&addrlist,mfc_ea2l(argp),(unsigned int)(element), sizeof(element), tag, MFC_GETL_CMD);
  spu_writech(MFC_WrTagMask, 1 << tag);
  spu_mfcstat(MFC_TAG_UPDATE_ALL);

  //データ取得1
  element[0].notify = 0;
  element[0].reserved = 0;
  element[0].size = sizeof(data1);
  element[0].eal = mfc_ea2l(addrlist[0]);

  spu_mfcdma64(&data1,mfc_ea2h(addrlist[0]),(unsigned int)(element), sizeof(element), tag,  MFC_GETL_CMD);
  spu_writech(MFC_WrTagMask, 1 << tag);
  spu_mfcstat(MFC_TAG_UPDATE_ALL);

  //2倍する
  int i;
  for (i=0; i < sizeof(data1); i++){
    data1[i] = data1[i] * 2;
  }

  //モードをPUTLに変えてメインメモリにデータを戻す
  spu_mfcdma64(&data1,mfc_ea2h(addrlist[0]),(unsigned int)(element), sizeof(element), tag, MFC_PUTL_CMD);
  spu_writech(MFC_WrTagMask, 1 << tag);
  spu_mfcstat(MFC_TAG_UPDATE_ALL);

  return 0;
}


変数から値を取り出して、処理後に同じ変数に戻す場合は、エレメントを触らずにそのまま引数をGET→PUTに変えるだけでできます


TOPプログラマ専用PS3 Linux SDL