Nanashi-soft○プログラマ専用○Windows gcc SDL○
今まで読み込み方法ばかりを説明してきましたが、書き込む方法も基本は同じです
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に変えるだけでできます