2013-06-13 14 views
6

Z wiatru można załadować jeden pływak z pamięci wszystkich 4 szczelinach __m128 z wewnętrzną _mm_load1_ps()AVX 256-bitowy odpowiednikiem _mm_load1_ps

podczas korzystania z 256 bitową SIMD z AVX, wydaje się, że no _mm256_load1_ps(), aby załadować pojedynczy float z pamięci do wszystkich 8 gniazd wektora.

Dlaczego to pominięcie i jaki jest najlepszy sposób obejścia tego?

Albo jeszcze lepiej: czy istnieje sposób na załadowanie pojedynczego elementu pływającego do docelowej szczeliny 0..7 wektora?

+0

AVX i AVX2 nadal pozwalają tylko wstawiać elementy do niskiego 128 ('PINSRD' /' INSERTPS': numer elementu = stała czasu kompilacji). Wykonanie tej czynności bez zerowania górnego poziomu 128 jest możliwe tylko przy kodowaniu innym niż VEX, co powoduje znaczne spowolnienie wstępnego skylake Intela przed miksowaniem instrukcji VEX i innych niż VEX. Można wyodrębnićf128, insertps, insertf128. –

+0

'_mm_load1_ps' jest kompozytowym wewnętrznym dla' movss' + shuffle do emisji float. Jeśli już chciałeś pozwolić kompilatorowi robić to, co chciałbyś uzyskać w rejestrze, '_mm256_set1_ps (* f)' jest dobrym wyborem. Inteligentne kompilatory będą emitować 'VBROADCASTSS' w stosownych przypadkach. –

Odpowiedz

9

_mm256_broadcast_ss jest tym, czego szukasz.

+0

Może coś źle zrozumiałem, ale dlaczego nie zrobić _mm256_set1_ps (* x)? http://stackoverflow.com/questions/13218391/is-mm-broadcast-ss-faster-than-mm-set1-ps –

+2

_mm256_set1_ps (* x) również zadziała, ale może wygenerować wiele instrukcji. _mm256_broadcast_ss gwarantuje wygenerowanie tylko jednej instrukcji, VBROADCASTSS –

Powiązane problemy