Czy SSE nie przypisuje obciążenia do siebie wolniej niż wyrównany ładunek wewnętrzny na procesorach Intel x64_64?

Rozważam zmianę kodu o wysokiej wydajności kodu, który obecnie wymaga 16-bajtowych wyrównanych tablic i zastosowań_mm_load_ps rozluźnić ograniczenie i użycie wyrównania_mm_loadu_ps. Istnieje wiele mitów na temat wpływu wyrównania pamięci na wydajność instrukcji SSE, więc zrobiłem mały testowy przypadek pętli związanej z przepustowością pamięci. Używając wyrównanego lub niezrównanego wewnętrznego obciążenia, uruchamia 100 iteracji przez dużą tablicę, sumując elementy z elementami SSE. Kod źródłowy jest tutaj.https://gist.github.com/rmcgibbo/7689820

Wyniki na 64-bitowym Macbook Pro z Sandy Bridge Core i5 są poniżej. Niższe liczby oznaczają szybszą wydajność. Gdy czytam wyniki, nie widzę w zasadzie żadnej straty wydajności przy używaniu _mm_loadu_ps na nie wyrównanej pamięci.

Uważam to za zaskakujące. Czy to uczciwy test / uzasadniony wniosek? Na jakiej platformie sprzętowej jest różnica?

$ gcc -O3 -msse aligned_vs_unaligned_load.c  && ./a.out  200000000
Array Size: 762.939 MB
Trial 1
_mm_load_ps with aligned memory:    0.175311
_mm_loadu_ps with aligned memory:   0.169709
_mm_loadu_ps with unaligned memory: 0.169904
Trial 2
_mm_load_ps with aligned memory:    0.169025
_mm_loadu_ps with aligned memory:   0.191656
_mm_loadu_ps with unaligned memory: 0.177688
Trial 3
_mm_load_ps with aligned memory:    0.182507
_mm_loadu_ps with aligned memory:   0.175914
_mm_loadu_ps with unaligned memory: 0.173419
Trial 4
_mm_load_ps with aligned memory:    0.181997
_mm_loadu_ps with aligned memory:   0.172688
_mm_loadu_ps with unaligned memory: 0.179133
Trial 5
_mm_load_ps with aligned memory:    0.180817
_mm_loadu_ps with aligned memory:   0.172168
_mm_loadu_ps with unaligned memory: 0.181852

questionAnswers(4)

yourAnswerToTheQuestion