ポインタが苦手?
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。。。
うーん、処理の内容はぜんぜん変わらないちゅーのにね。。。。。
| 固定リンク | コメント (0) | トラックバック (0)
最近のコメント