パスワードを忘れた? アカウント作成
572509 journal

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で自動ベクトル化されるぜばんざーい」みたいな薄っぺらな広告と変わらない記述ばっかりヒットする。困ったもんだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • この辺りの話 [google.com]のことでしょうか?
    間違ってたらすみません。

    # mbbtombc…げふんげふん
    • はい、まさに__attribute__((aligned(64)))みたいな話なのですが、対象物が違うのです。

      ある変数なり、配列の先頭アドレスを「64の倍数にする」時はこの属性をつければよいのはgccのinfoにも書いています。

      しかし、私がやりたいのはある(ポインタ)変数の値が、16とか64の倍数であることを明示的にgccに教えたいということなのです。

      gccは「このポインタ変数はアライメントがあってないかもしれないから」と考えて、un-alignment load/store命令を生成しちゃうのですが、これだと遅いので、「この変数は常に16の倍数だ」ということを指定して、aligned load/store命令が生成されるようにしたいのです…

      --
      -- Takehiro TOMINAGA // may the source be with you!
      親コメント
  • Intel系だと、8086のセグメント区切りが16バイト境界になっていたので、
    これをパラグラフという名前で呼んでいましたね。

    あそこは、バイトはともかく、16Bitをワード、32Bitをダブルワードと
    名付けているので、かなり用語の使い方も違っていますが。

    # 普通、語長(ワード)って、プロセッサに合わせるもんだと思うのだが。
  • by Anonymous Coward on 2005年05月06日 23時47分 (#731732)
    gcc4持入れていないので分からないのですが、
    struct tmp { char a[128] __atribute__ (aligned(128)); };

    void func(struct tmp *a) {
      .....
      for(.....) ((FLOAT*)a)[i] *= (FLOAT)-1.0;
      .....
    }
    みたいな感じでは解決できませんか?
typodupeerror

ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家

読み込み中...