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に変えるだけでできます