Wie lade / speichere ich mit GNU C Vector Extensions von / zu einem Array von Doubles?

Ich benutze GNU C Vector Extensions, nicht Intels_mm_* intrinsics.

Ich möchte das Gleiche tun wie Intels_m256_loadu_pd intrinsic. Das Zuweisen der Werte nacheinander ist langsam: gcc erzeugt Code mit 4 Ladeanweisungen anstelle eines einzelnenvmovupd (welche_m256_loadu_pd erzeugt).

typedef double vector __attribute__((vector_size(4 * sizeof(double))));

int main(int argc, char **argv) {
    double a[4] = {1.0, 2.0, 3.0, 4.0};
    vector v;

    /* I currently do this */
    v[0] = a[0];
    v[1] = a[1];
    v[2] = a[2];
    v[3] = a[3];
}

Ich möchte so etwas:

v = (vector)(a);

ode

v = *((vector*)(a));

aber auch nicht arbeiten. Der erste Fehler schlägt mit "Wert kann nicht in einen Vektor konvertiert werden" fehl, während der zweite Fehler zu Segfaults führt.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage