3

我正在尝试通过 blitz++ 数组库中的编译器来促进自动矢量化。出于这个原因,我想展示固定长度向量块中的数组数据的视图,这些向量已经很好地向量化了。但是,我无法弄清楚类型别名规则与动态分配的数组一起意味着什么。

这是想法。一个数组目前包括

T_numtype* restrict data_;

操作是通过循环这些数据来完成的。我想做的是将此数组的另一种视图呈现为 的数组TinyVector<T_numtype, N>,它是一个固定长度的向量,其操作使用表达式模板机制完全向量化。这个想法是 L 长度数组应该是T_numtype[L]or 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],这要复杂得多。

那么,有没有一种方法可以合法地创建一个并集T_numtype data_[L]TinyVector<T_numtype, N>[L/N]其中 L 是一个动态确定的大小?

(我知道还有其他对齐问题,即 N 必须是与 TinyVector 成员的对齐方式相同的值,否则数组中会有孔。)

4

1 回答 1

0

别名很难合法化。但是,如果某些“操作是通过循环这些数据来完成的。”,这些操作是否要求这些数据恰好是 T_numtype 的数组?

最好用一个类型的数据成员将数据包装在一个类中,TinyVector<T_numtype, N>[L/N]甚至std::vector<TinyVector<T_numtype, N> >因为 L 显然是在运行时确定的,并为那些希望将整个数据作为单个序列循环的操作公开一对迭代器。

于 2011-05-23T21:55:50.273 回答