本サイトは、マルチコア トータルソリューションカンパニー -フィックスターズの技術者有志が運営するサイトです。

3.7 演習問題 (3-2) 大文字変換プログラム

出典: PS3 Linux Information Site / Cell/B.E.のパワーを体験しよう

 演習問題 (3-2) では、第3.3節第3.4節で学習した内容について出題します。

【問題】

 出題プログラム (3-2) は、小文字 (a~z) を大文字 (A~Z) に変換するプログラムです。このプログラムを、SIMD演算を利用したSPEプログラムに書き換えなさい。

 ただし、SPEプログラム側で変換処理する文字列 (“A Quick Brown Fox Jumps Over The Lazy Dog.”) は、DMA転送を用いてPPEプログラムから渡されることとします。


【出題プログラム (3-2)】

 1 #include <stdio.h>
 2
 3 #define LENGTH  (48)
 4
 5 char in[LENGTH] = "A Quick Brown Fox Jumps Over The Lazy Dog.\0";
 6 char out[LENGTH];
 7
 8 int main(int argc, char **argv)
 9 {
10     int i;
11     char offset = 'a' - 'A';
12
13     for (i = 0; i < sizeof(in); i++) {
14         if (in[i] >= 'a' && in[i] <= 'z') {
15             out[i] = in[i] - offset;
16         } else {
17             out[i] = in[i];
18         }
19     }
20
21     printf("in  = %s\n", in);
22     printf("out = %s\n", out);
23
24     return 0;
25 }

⇒出題プログラム (3-2) のソースコードはこちらから


【解答方針】

 この問題は、DMA転送のプログラミング方法を理解しているかがポイントになります。DMA転送方法については第3.3節を参考にしてください。

 また、SPU SIMD命令の比較命令には、表 3.2に掲載されているspu_cmpeq()関数、spu_cmpgt()関数のみが提供されていて、>=演算子や、<=演算子に相当する組み込み関数は存在しません。提供された組み込み関数をうまく利用して、解答プログラムを作成してください。


 なお、ASCIIコードとは7ビットの情報を用いて表現される文字コードです。表 3.3のASCIIコード表に示したとおり、アルファベットの大文字と小文字は一定のオフセット値 (0x20) を利用することで変換できます。


表 3.3 ASCIIコード表

画像:TABLE-03-01.png


表示
個人用ツール
オープンソースプロジェクト
ツールボックス