演習問題 (2-3)
#include <stdio.h>
#include <altivec.h>

#define SIZE    (16)

float in[SIZE] __attribute__((aligned(16))) = {  1,  -2,  3,  -4,
                    5,  -6,  7,  -8,
                    9, -10, 11, -12,
                    13, -14, 15, -16 };
float out[SIZE] __attribute__((aligned(16)));

static float zero[4] __attribute__((aligned(16)));

int main(int argc, char *argv[])
{
  int i;
  vector float *va = (vector float *)in;
  vector float *vc = (vector float *)out;
  vector float *vz = (vector float *)zero;
  vector unsigned int vpat;
  vector float vc_true, vc_false;

  for (i = 0; i < SIZE / sizeof(float); i++) {
    vpat = vec_cmpgt(*vz, va[i]);
    vc_true  = vec_sub(*vz, va[i]);
    vc_false = va[i];
    vc[i] = vec_sel(vc_false, vc_true, vpat);
  }

  for (i = 0; i < SIZE; i++) {
    printf("out[%02d]=%0.0f\n", i, out[i]);
  }

  return 0;
}
例題プログラム2-3を見ていたら、元の配列からvectorにキャストしたときに、vectorの配列のように扱えることができることがわかったので、2-2よりすっきりしている。
同じように書き換えれば、2-2ももう少し綺麗になるはず。

演習2-4は面倒なのでパス。今までのまとめなので、同じようにやればできるはず&いかにループや演算回数を減らすかで頭を使えそうではあるんだけど・・。
仕事ではこう言うパズルのような頭を使うことはないんだけど、たまにはこんな感じのも悪くないかなあ。脳の老化を感じます(笑)

カテゴリ

トラックバック(0)

このブログ記事を参照しているブログ一覧: CELLプログラミングその2

このブログ記事に対するトラックバックURL: https://www.wizard-limit.net/cgi-bin/mt/mt-tb.cgi/1114

コメントする

このブログ記事について

このページは、falseが2007年1月 1日 21:44に書いたブログ記事です。

ひとつ前のブログ記事は「CELLプログラミングその1」です。

次のブログ記事は「CELLプログラミングその3」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

広告

Powered by Movable Type 6.1.1