Ich versuche, die automatische Vektorisierung durch den Compiler in der Array-Bibliothek von blitz++ zu erleichtern. Aus diesem Grund möchte ich eine Ansicht der Array-Daten, die in Brocken von Vektoren fester Länge, die bereits gut vektorisiert sind, präsentieren. Ich kann jedoch nicht herausfinden, was die Typ-Aliasing-Regeln in Verbindung mit dynamisch zugewiesenen Arrays bedeuten.
Hier ist die Idee. Ein Array besteht derzeit aus
T_numtype* restrict data_;
Die Operationen werden in einer Schleife über diese Daten ausgeführt. Ich möchte eine alternative Sicht auf dieses Array als Array von TinyVector<T_numtype, N>
der ein Vektor fester Länge ist, dessen Operationen mit Hilfe der Ausdrucksvorlagen vollständig vektorisiert werden. Die Idee ist, dass ein Array der Länge L entweder sein sollte T_numtype[L]
o TinyVector<T_numtype, N>[L/N]
. Gibt es eine Möglichkeit, dies zu bewerkstelligen, ohne gegen die Regeln für die Typisierung zu verstoßen?
Für ein statisch zugewiesenes Array würde man Folgendes tun
union {
T_numtype data_[L];
TinyVector<T_numtype, N>[L/N];
};
Am ehesten kann ich mir vorstellen, dass die Definition
typedef union {
T_numtype data_[N];
TinyVector<T_numtype, N>;
} u;
u* data_;
und ordnen Sie es dann mit
data_ = new u[L/N];
Aber es scheint, dass ich jetzt mein Recht aufgegeben habe, mich an die gesamte Array als ein flaches Array vom Typ T_numtype, so dass ich, um auf ein bestimmtes Element zuzugreifen, Folgendes tun müsste data_[i/N].data_[i%N]
was sehr viel komplizierter ist.
Gibt es also eine Möglichkeit, rechtlich eine Vereinigung von T_numtype data_[L]
y TinyVector<T_numtype, N>[L/N]
wobei L eine dynamisch bestimmte Größe ist?
(Ich bin mir bewusst, dass es zusätzliche Ausrichtung Bedenken, d.h. N muss ein Wert, der die gleiche wie die Ausrichtung des TinyVector Mitglied ist, sonst gibt es Löcher in das Array sein).