本サイトは、Cell トータルソリューションカンパニー -フィックスターズの技術者有志が運営するサイトです。
2.7 演習問題 (2-2) 小数点計算プログラム
出典: PS3 Linux Information Site / Cell/B.E.のパワーを体験しよう
演習問題 (2-2) では、第2.4節で学習した内容について出題します。
【問題】
出題プログラム (2-2) は、1~16の整数値それぞれに0.5を乗算した結果を求めるプログラムです。このプログラムをSIMD演算を用いて計算するように書き換えなさい。
このプログラムでは、整数値1~16はunsigned short型のスカラ配列inで与えられます。また、小数点計算をおこなった結果は、float型のスカラ配列outに格納します。
【出題プログラム (2-2)】
1 #include <stdio.h>
2
3 #define SIZE (16)
4
5 unsigned short in[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8,
6 9, 10, 11, 12, 13, 14, 15, 16 };
7 float out[SIZE];
8
9 int main(int argc, char **argv)
10 {
11 int i;
12
13 for (i = 0; i < SIZE; i++) {
14 out[i] = (float) in[i] * 0.5f;
15 }
16
17 for (i = 0; i < SIZE; i++) {
18 printf("out[%02d]=%0.1f\n", i, out[i]);
19 }
20
21 return 0;
22 }
⇒出題プログラム (2-2) のソースコードはこちらから
【解答方針】
この問題では、ベクタデータのデータ型をどのようにしてSIMD演算で変換するかがポイントになります。小数点計算をおこなうためには、与えられたデータ型 (unsigned short型) を浮動小数点のデータ型 (float型) に変換する必要があります。SIMD演算では、vec_ctf()関数を利用することによって整数から浮動小数点への型変換をおこないます。
ここで注意すべき点は、vec_ctf()関数は、引数として32ビットint型のベクタデータしか扱えないということです。そこで、まず16ビットunsigned short型のデータを32ビットunsigned int型のデータに変換する必要があります。SIMD演算によるunsigned short型からunsigned int型への変換は、第2.4節で解説したベクタデータの並べ替えによっておこないます。
![]() |
| 「第2.6節」へ戻る | 「第2章目次」 | 「演習問題 (2-2) の解答」へ進む |
| 「チュートリアル目次」 |

