3

blitz++ 配列ライブラリーのコンパイラーによる自動ベクトル化を容易にしようとしています。このため、既に適切にベクトル化されている固定長ベクトルのチャンクにある配列データのビューを提示したいと思います。ただし、動的に割り当てられた配列と組み合わせて、型のエイリアシング規則が何を意味するのかわかりません。

これがアイデアです。現在、配列は次のもので構成されています

T_numtype* restrict data_;

操作は、これらのデータをループすることによって行われます。私がやりたいのは、この配列の代替ビューを の配列として提示することですTinyVector<T_numtype, N>。これは、式テンプレート機構を使用して演算が完全にベクトル化される固定長ベクトルです。T_numtype[L]長さ L の配列は または のいずれかでなければならないという考え方TinyVector<T_numtype, N>[L/N]です。タイプアラシングルールに違反することなくこれを達成する方法はありますか?

静的に割り当てられた配列の場合、次のようになります

union {
  T_numtype data_[L];
  TinyVector<T_numtype, N>[L/N];
};

私が考えることができる最も近いものは、定義することです

typedef union {
  T_numtype data_[N];
  TinyVector<T_numtype, N>;
} u;
u* data_;

そしてそれを割り当てます

data_ = new u[L/N];

しかし、配列全体を T_numtype のフラットな配列としてアドレス指定する権利を放棄したようです。そのため、特定の要素にアクセスするには を行う必要がありdata_[i/N].data_[i%N]、これははるかに複雑です。

では、 L が動的に決定されるサイズであるT_numtype data_[L]andの和集合を合法的に作成する方法はありますか?TinyVector<T_numtype, N>[L/N]

(追加のアラインメントの問題があることは承知しています。つまり、N は TinyVector メンバーのアラインメントと同じ値でなければなりません。そうしないと、配列に穴ができてしまいます。)

4

1 に答える 1

0

エイリアシングを合法化するのは困難です。ただし、「これらのデータをループすることによって操作が行われる」場合、それらの操作では、これらのデータが正確に T_numtype の配列である必要がありますか?

型の 1 つのデータ メンバーを持つクラスでデータをラップするTinyVector<T_numtype, N>[L/N]std::vector<TinyVector<T_numtype, N> >、L が実行時に明らかに決定されるため、データをクラスにラップし、データ全体を 1 つのシーケンスとしてループする操作用にイテレータのペアを公開する方がよい場合があります。

于 2011-05-23T21:55:50.273 に答える