Mam wektor __m256d z czterema 64-bitowymi wartościami zmiennoprzecinkowymi.
Potrzebuję znaleźć poziomą wartość maksymalną elementów wektora i zapisać wynik w podwójnej precyzji wartości skalarnej;Jak znaleźć poziomą wartość maksymalną w 256-bitowym wektorze AVX
Wszystkie moje próby zakończyły się użyciem wielu tasowań elementów wektorowych, dzięki czemu kod nie był zbyt elegancki ani wydajny. Ponadto nie mogłem pozostać tylko w domenie AVX. W pewnym momencie musiałem użyć 128-bitowych instrukcji SSE, aby wyodrębnić ostateczną wartość 64-bitową. Chciałbym jednak udowodnić, że nie mam racji w tym ostatnim oświadczeniu.
Idealne rozwiązanie:
1) Używaj tylko instrukcji AVX.
2) zminimalizować liczbę instrukcji. (Mam nadzieję, że nie więcej niż 3-4 instrukcje)
Po tym wszystkim, wszelkie eleganckie/wydajne rozwiązania będą akceptowane, nawet jeśli nie będą zgodne z powyższymi wytycznymi.
Dzięki za pomoc.
-Luigi
To trudne pytanie ... Czy robisz to tylko 1 wektora? Czy masz wiele wektorów, dla których musisz znaleźć maksimum? Możesz (dość) wydajnie zrobić 4 z nich równolegle z transpozycją wektora 4 x 4 ... – Mysticial
@Mysticial: Cóż ... Mam do czynienia z wieloma wektorami. Jednak prostota przetwarzania nie usprawiedliwia dwóch operacji transpozycji 4x4 dla każdej iteracji. Przetwarzam wszystko "w poziomie" bez transpozycji. W ten sposób uzyskuję duże przyspieszenie, zbliżone do 4x, ponieważ unikam nakładu transpozycji. Wszystko jest w ciasnej pętli ręcznie rozwijane 4 razy.Jednak po zakończeniu pętli pozostawiam jeden ostatni wektor AVX. Muszę znaleźć największy z czterech elementów, aby zapisać wynik z powrotem w mojej podwójnej precyzji wartości skalarnej. Stąd moje pytanie ... –
Jeśli nie jest w "ciasnej pętli", czy jest to nawet krytyczne? – Mysticial