- 338 名前:デフォルトの名無しさん [2010/04/21(水) 02:45:57 ]
- ポインタ渡しの関数内でSIMDを使いたい場合、仮引数をstruct{long __attribute__((aligned(16)))
a[2][8];}*aのようにして、a->a[i][j]でアクセスしないとアライメントデータとして扱われない。 ソース冒頭で構造体型定義を使っても可。もっと簡単にポインタがアライメントされて いる事をgccに分からせる方法はないの? また、func(struct{long __attribute__((aligned(16))) a[2][32];}*__restrict a, struct{long __attribute__((aligned(16))) a[2][32];}*__restrict b, int *__restrict c){ int i;for (i=0;i<8;i++){a->a[0][*c*4+i]=b->a[0][i];a->a[1][*c*4+i]=b->a[1][i];} } のように二次元配列を2つ受け取り、ポインタ渡しで指定されたオフセット分ずらして 転送する関数を書くと、versioning for alias requiredとなり非SIMDコードも生成 されるが、[*c*4+i]を[(*c+=0)*4+i]とすると非SIMDコードは生成されない。 >>335 OSSへの破壊工作ってあるの?
|

|