« 微妙に細かいバグというか | トップページ | 難航 »

2007年4月29日 (日)

ポインタが苦手?

IntelC++と付き合って半年近くなるけど、最近彼女はポインタが大の苦手であることが判明した。

たとえば、こんなループ

foo() {
  float *buffer;
  buffer = malloc(256 * sizeof(float));
  for (int i = 0; i < 16 ; i++) {
    float* buf = &buffer[i * 16];
  #pragma vector aligned //<ベクトル化してお願い
    for (j = 0; j < 16; j++) {
      buf[j] *= 2;
    }
  }
}
というようなループなんだけど、#pragma vector alignedというプラグマでベクトル化をお願いしても、嫌だと断られてしまいます。
で、以下のように書き直すとベクトル化してくれます

foo() {
  float *buffer;
  buffer = malloc(256 * sizeof(float));
  for (int i = 0; i < 16 ; i++) {
    float* buf = &buffer[i * 16];
    DoJ(buf, 16);
  }
}

void DoJ(float* buf, int size) {
  #pragma vector aligned //<ベクトル化してお願い
  for (int j = 0; j < size; j++) {
    buf[j] *= 2;
  }
}

ようするにbuf = &buffer[i * 16] とかやってループの途中にアドレス計算なんかを入れると途端に何がなんだかわからなくなるのだと思われます。
でも、内側のループを関数に外だしすると何故かベクトル化OK。。。
うーん、処理の内容はぜんぜん変わらないちゅーのにね。。。。。

|

« 微妙に細かいバグというか | トップページ | 難航 »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: ポインタが苦手?:

« 微妙に細かいバグというか | トップページ | 難航 »