本サイトは、Cell トータルソリューションカンパニー -フィックスターズの技術者有志が運営するサイトです。
2.8 演習問題 (2-3) 絶対値計算プログラム
出典: PS3 Linux Information Site / Cell/B.E.のパワーを体験しよう
演習問題 (2-3) では、第2.5節で学習した内容について出題します。
【問題】
出題プログラム (2-3) は、スカラ配列で定義された16個の数値それぞれの絶対値を求めるプログラムです。このプログラムをSIMD演算を用いて計算するように書き換えなさい。
このプログラムは、16個の正と負の数値が混在したスカラ配列に対して、それぞれの要素が正であるか、負であるかを判断し、負の場合は符号を反転させます。
入力データは、16個の要素からなるスカラ配列inで与えられます。スカラ配列inのそれぞれの要素の絶対値を計算した結果をスカラ配列outに出力データとして格納します。
【出題プログラム (2-3)】
1 #include <stdio.h>
2
3 #define SIZE (16)
4
5 float in[SIZE] = { 1, -2, 3, -4,
6 5, -6, 7, -8,
7 9, -10, 11, -12,
8 13, -14, 15, -16 };
9 float out[SIZE];
10
11 int main(int argc, char **argv)
12 {
13 int i;
14
15 for (i = 0; i < SIZE; i++) {
16 if (in[i] > 0) {
17 out[i] = in[i];
18 } else {
19 out[i] = in[i] * -1;
20 }
21 }
22
23 for (i = 0; i < SIZE; i++) {
24 printf("out[%02d]=%0.0f\n", i, out[i]);
25 }
26
27 return 0;
28 }
⇒出題プログラム (2-3) のソースコードはこちらから
【解答方針】
第2.5節で解説したようにSIMD演算では個々の要素に対して条件分岐をおこなっていては効率がよくありません。この問題では、条件分岐をいかに削除するかがポイントになります。
なお、絶対値を計算する組み込み関数としてvec_abs()関数が用意されていますが、この問題ではvec_abs()関数は使わずに解答してください。
| 「演習問題 (2-2)」へ戻る | 「第2章目次」 | 「演習問題 (2-3) の解答」へ進む |
| 「チュートリアル目次」 |
