Ho un vettore __m256d pieno di quattro valori a virgola mobile a 64 bit.
Ho bisogno di trovare il massimo orizzontale degli elementi del vettore e di memorizzare il risultato in un valore scalare a doppia precisione;Come trovare il massimo orizzontale in un vettore AVX a 256 bit
I miei tentativi hanno finito per utilizzare molto il rimescolamento degli elementi vettoriali, rendendo il codice non molto elegante né efficiente. Inoltre, ho trovato impossibile rimanere solo nel dominio AVX. A un certo punto ho dovuto usare le istruzioni SSE a 128 bit per estrarre il valore finale a 64 bit. Tuttavia, mi piacerebbe essere smentito in quest'ultima affermazione.
Quindi la soluzione ideale sarà:
1) utilizzare solo le istruzioni AVX.
2) ridurre al minimo il numero di istruzioni. (Spero di non più di 3-4 istruzioni)
Detto questo, qualsiasi soluzione elegante/efficiente sarà accettata, anche se non aderisce alle linee guida di cui sopra.
Grazie per qualsiasi aiuto.
-Luigi
Questa è una domanda difficile ... stai facendo questo con solo 1 vettore? O hai molti vettori per i quali hai bisogno di trovare il massimo? È possibile (abbastanza) efficiente fare 4 di questi in parallelo con una trasposizione vettoriale 4 x 4 ... – Mysticial
@Mysticial: Beh ... Ho a che fare con molti vettori. Tuttavia, la semplicità dell'elaborazione non giustifica due operazioni di trasposizione 4x4 per ogni iterazione. Quindi sto elaborando tutto "orizzontalmente" senza trasposizione. Sto ottenendo una grande accelerazione in questo modo, vicino a 4x, perché sto evitando il sovraccarico di trasposizione. Tutto è in un circuito chiuso manualmente srotolato 4 volte.Tuttavia, quando il ciclo è finito, mi rimane un ultimo vettore AVX. Devo trovare il massimo dei suoi quattro elementi per archiviare il risultato nel mio valore scalare a doppia precisione. Quindi la mia domanda ... –
Se non è nel "circuito chiuso", è anche critica delle prestazioni? – Mysticial