A v čem je rozdíl?
Shuffle akorát vyzobává hodnoty vertikálně/diagonálně z několika různých registrů místo vyzobávání hodnot z jednoho registru (horizontálně, jako to dělá gather/scatter). Vždyť je to stejný princip.
Všechny akorát dělají vektorový ekvivalent skalární instrukce MOV. Akorát kvůli registrům je to celé zbytečně komplikované. Ve skutečnosti CPU stejně dělá renaming na fyzických registrech a žádné data nepřesouvá. Stejně jako v C/C++ když přesouváš data, tak to děláš přes pole pointerů, ale ve skutečnosti data samotná se nehnou ani o bit.
24. 6. 2023, 14:25 editováno autorem komentáře
Akorát... shuffle a instrukce tohohle typu jsou to, co umožňuje dělat složitější algoritmy než "65000× vynásobit". Když potřebuju, aby se ty výpočty neděly jenom v rámci jednotlivých pruhů, ale aby se ty hodnoty nějak přemísťovaly. V multimediálním kódu typu video jsou dost stěžejní, například tahle instrukce je hodně důležitá a užitečná: https://www.chessprogramming.org/SSSE3#PSHUFB
Akorát když se to dělá přes skalární FPU, tak na to nepotřebuješ žádnou speciální Shuffle instrukci. Prostě si pointerem sáhneš přímo do pole pro jakoukoliv hodnotu i bez Shuffle.
Tady vidíš kolik zbytečných instrukcí sebou ty SIMD nesou, jenom aby měli stejnou funkcionalitu jako obyč skalár FPU výpočet. Když u AVX změníš délku registru tak musíš automaticky mít i nové instrukce, protože je to fixní, že jo. Tohle je jedna výhod SVE2, jinak by museli mít 16 verzí instrukcí pro těch 16 různých délek vektorů (třeba 384-bit nebo 640-bit ...).