ttの日記: むずかしい 4
日記 by
tt
がんばってるんですがgcc4に言う事を聞かせることが余り出来ません。ポインタ変数にrestrictつけまくったりしてるんだけどだめぽ。
なお、以前のエントリで書いた
for (band = -16; band < 0; band++)
samp[band] *= (FLOAT)-1.0;
はちゃんとrestrictつけたらベクトル化されました。めでたし。でもこんなのベクトル化しても誤差だし…(汗)。
あと、上記コードでsampは関数の外部から指定されるポインタなんですが、そいつが常時16アライメント(16の倍数となるアドレスになっている)ことを、gccに知らせる方法が良く分からんです。
attributeだと思うんだけど。うーん。googleしたけど全然ヒットせず。「Appleの新しいTigerならgccで自動ベクトル化されるぜばんざーい」みたいな薄っぺらな広告と変わらない記述ばっかりヒットする。困ったもんだ。
最近の話はよくわからんのですが… (スコア:1)
間違ってたらすみません。
# mbbtombc…げふんげふん
Re:最近の話はよくわからんのですが… (スコア:1)
ある変数なり、配列の先頭アドレスを「64の倍数にする」時はこの属性をつければよいのはgccのinfoにも書いています。
しかし、私がやりたいのはある(ポインタ)変数の値が、16とか64の倍数であることを明示的にgccに教えたいということなのです。
gccは「このポインタ変数はアライメントがあってないかもしれないから」と考えて、un-alignment load/store命令を生成しちゃうのですが、これだと遅いので、「この変数は常に16の倍数だ」ということを指定して、aligned load/store命令が生成されるようにしたいのです…
-- Takehiro TOMINAGA // may the source be with you!
16バイト境界 (スコア:1)
これをパラグラフという名前で呼んでいましたね。
あそこは、バイトはともかく、16Bitをワード、32Bitをダブルワードと
名付けているので、かなり用語の使い方も違っていますが。
# 普通、語長(ワード)って、プロセッサに合わせるもんだと思うのだが。
見当違いならごめんなさい (スコア:0)
struct tmp { char a[128] __atribute__ (aligned(128)); };
void func(struct tmp *a) {
.....
for(.....) ((FLOAT*)a)[i] *= (FLOAT)-1.0;
.....
}
みたいな感じでは解決できませんか?