我希望能够通过编译器在blitz++数组库中实现自动向量化。因此,我想展示一个数组数据的视图,其中包含固定长度向量的块,这些向量已经很好地进行了向量化。然而,我无法弄清楚类型别名规则与动态分配数组相结合时的含义。
这是我的想法。一个数组目前由...
操作是通过循环这些数据来完成的。我想做的是将这个数组以
对于静态分配的数组,可以这样做:
这是我的想法。一个数组目前由...
T_numtype* restrict data_;
操作是通过循环这些数据来完成的。我想做的是将这个数组以
TinyVector<T_numtype, N>
的形式呈现为另一种选择,它是一个固定长度的向量,其操作完全使用表达式模板机制进行向量化。想法是 L 长度的数组应该是 T_numtype[L]
或者 TinyVector<T_numtype, N>[L/N]
。有没有一种方法可以在不违反类型别名规则的情况下完成这个操作?对于静态分配的数组,可以这样做:
union {
T_numtype data_[L];
TinyVector<T_numtype, N>[L/N];
};
The closest I could think of is to define
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成员对齐相同的值,否则数组中会有空洞。)
new
来分配它。 - Lutormreinterpret_cast<>
的领域之一。要么你玩得很卑鄙,以挤出最后一滴性能,要么你玩得很安全并接受成本。两者不能兼得。我认为联合是更高级的技巧,增加了不必要的复杂性;TinyVector必须直接匹配数组的内存布局。真的没有理由让它变得那么难。您可以保持TinyVector开放,并只是硬别名(引用)数组的存储区域。 - sehe