14

特定の配列にアクセスする唯一の方法は myarray[index] を使用することであることを C99 コンパイラに伝える方法はありますか? 次のように言います。

int heavy_calcualtions(float* restrict range1, float* restrict range2)
{
    float __I promise I won't alias this__ tmpvalues[1000] = {0};

    ....
    heavy calculations using range1, range2 and tmpvalues;
    ....
}

restrict を使用することで、range1 と range2 をエイリアスしないことを約束しましたが、関数内で宣言された配列に対して同じことを行うにはどうすればよいでしょうか?

4

2 に答える 2

4

なぜ次のことができないのですか?その変数を介して関連付けられたデータにアクセスしていないためtmpvalues、コードの計算集約的な部分で制限ポインターを使用することは有効です。

#include <stdio.h>
#include <stdlib.h>

int heavy_calcs(int n, float* restrict range1, float* restrict range2)
{
    if (n>1000) return 1;
    float tmpvalues[1000] = {0};
    {
        float * restrict ptv = tmpvalues;
        for (int i=0; i<n; i++) {
            ptv[i] = range1[i] + range2[i];
        }
    }
    return 0;
}

int main(int argc, char * argv[])
{
    int n = (argc>1) ? atoi(argv[1]) : 1000;
    float * r1 = (float*)malloc(n*sizeof(float));
    float * r2 = (float*)malloc(n*sizeof(float));
    int rc = heavy_calcs(n,r1,r2);
    free(r1);
    free(r2);
    return rc;
}

これを Intel 15 コンパイラーで実行しましたが、ループのベクトル化に問題はありませんでした。確かに、このループは、私があなたのものと比較すると些細なことなので、マイレージは異なる場合があります。

于 2015-04-28T21:07:20.053 に答える