Nanashi-soft○プログラマ専用○Windows gcc SDL○
SPEで処理を行う為には、メインメモリからデータを DMA転送する必要があります
どのように転送を行えば効率が良いのか? を検証より導き出したいと思います
・16バイト単位で、様々なサイズを転送してみる
・アラインメントを変えてみる
・ギャザーを使ってみる
・複数のSPEを使ってみる
SPEの検証なので、PPE側のプログラムはほぼ固定にします
PPE側プログラムは別ページにて
内容は 1920×1080×4byteのデータを SPEから取得すると言うものです
画面データを高速転送したい、というイメージです
SPE側から 16バイト単位、32バイト単位、48バイト単位……と、16バイトずつ増やしてデータを取得してみます
SPE側プログラムは別ページにて
| 処理単位(byte) | 処理時間(ミリ秒) |
|
16 |
8053 |
|
32 |
4100 |
|
48 |
3323 |
|
64 |
2566 |
|
80 |
2029 |
|
96 |
1745 |
|
112 |
1476 |
|
128 |
1323 |
|
144 |
1168 |
|
160 |
1081 |
|
176 |
1011 |
|
192 |
944 |
| 処理単位(byte) | 処理時間(ミリ秒) |
|
560 |
406 |
|
576 |
405 |
|
592 |
569 |
|
608 |
1293 |
|
624 |
1101 |
|
640 |
1364 |
|
656 |
1431 |
|
672 |
2018 |
|
688 |
2928 |
|
704 |
2651 |
|
720 |
757 |
|
736 |
1920 |
|
752 |
925 |
|
768 |
1428 |
|
784 |
483 |
|
800 |
465 |
|
816 |
343 |
| 処理単位(byte) | 処理時間(ミリ秒) |
|
16352 |
176 |
|
16368 |
170 |
|
16384 |
177 |
|
16400 |
Bus Error |
|
16416 |
Bus Error |
|
16432 |
Bus Error |
DMA転送は128バイトアラインメントが効率が良いと言われています
本当にそうなのか? を検証します
○PPE側プログラム変更点
//処理データ
unsigned char data1[1920*1080*4] __attribute__((aligned(16)));
↓
unsigned char data1[1920*1080*4] __attribute__((aligned(128)));
○SPE側プログラム変更点
//データ受け取り用(このサイズを色々変えて計測する)
unsigned char data1[16] __attribute__((aligned(16)));
↓
unsigned char data1[16] __attribute__((aligned(128)));
| 処理単位(byte) | 処理時間(ミリ秒) |
|
464 |
454 |
|
480 |
438 |
|
496 |
433 |
|
512 |
3622 |
|
528 |
440 |
|
544 |
458 |
|
560 |
415 |
|
576 |
3558 |
|
592 |
527 |
|
608 |
971 |
|
624 |
1090 |
|
640 |
307 |
|
656 |
1343 |
|
672 |
678 |
|
688 |
1220 |
|
704 |
322 |
|
720 |
830 |
|
736 |
363 |
|
752 |
546 |
|
768 |
274 |
|
784 |
952 |
|
800 |
398 |
|
816 |
318 |
|
832 |
287 |
|
128バイト |
16バイト |
|
| 処理単位(byte) | 処理時間(ミリ秒) | |
|
9600 |
131 |
180 |
|
9616 |
174 |
174 |
|
9632 |
170 |
180 |
|
9648 |
175 |
175 |
|
9664 |
157 |
181 |
|
9680 |
174 |
174 |
|
9696 |
169 |
181 |
|
9712 |
174 |
175 |
|
9728 |
131 |
180 |
|
9744 |
174 |
174 |
|
9760 |
171 |
180 |
|
9776 |
174 |
175 |
|
9792 |
156 |
181 |
|
9808 |
174 |
175 |
|
9824 |
169 |
181 |
|
9840 |
175 |
174 |
|
9856 |
131 |
179 |
○DMA転送効率化の条件
1)データはできる限りまとめて転送する
2)608〜708バイトずつ転送するのは避ける
128バイトアラインメントの時は512〜784バイトずつ転送するのは避ける
3)1度に転送できるのは16384バイト(16KB)まで
4)128バイトアラインメントで変数を宣言し、128バイトの倍数で転送を行う
尚、環境は
・Fedora Core 5
・Linux Kernel 2.6.16(PS3アドオンCDデフォルト)
・Cell SDK 2.0
です
《補足》
以下の環境にて同様の検証を行った場合、2)の異常転送は発生しませんでした
・Fedora Core 6
・Linux Kernel 2.6.21(PS3アドオンCDに同梱されているもの)
・Cell SDK 2.1