Ho un vettore compresso di quattro valori a virgola mobile a 64 bit.
Vorrei ottenere la somma degli elementi del vettore.Il modo più veloce per eseguire la somma vettoriale orizzontale con le istruzioni AVX
Con SSE (e usando carri a 32-bit) ho potuto solo effettuare le seguenti operazioni:
v_sum = _mm_hadd_ps(v_sum, v_sum);
v_sum = _mm_hadd_ps(v_sum, v_sum);
Purtroppo, anche se AVX presenta un'istruzione _mm256_hadd_pd, si differenzia nel risultato dalla versione SSE. Credo che ciò sia dovuto al fatto che la maggior parte delle istruzioni AVX funzionano come istruzioni SSE per ogni minimo e alto 128 bit separatamente, senza mai superare il limite di 128 bit.
Idealmente, la soluzione che sto cercando dovrebbe seguire le seguenti linee guida:
1) utilizzare solo le istruzioni AVX/AVX2. (no SSE)
2) eseguirlo in non più di 2-3 istruzioni.
Tuttavia, qualsiasi modo efficiente/elegante per farlo (anche senza seguire le linee guida di cui sopra) è sempre ben accettato.
Grazie mille per qualsiasi aiuto.
-Luigi Castelli
Inizia con '_mm256_extractf128_ps',' _mm_add_ps' le due metà, quindi utilizzare [i metodi esistenti per ridurre un vettore 128b] (http://stackoverflow.com/questions/6996764/fastest-way-to -do-orizzontale-flottante somma vettoriale-on-x86). –