Я рассматриваю возможность изменения кода высокой производительности кода, который в настоящее время требует 16 байт выровненных массивов и использует _mm_load_ps
для ослабления ограничения выравнивания и использования _mm_loadu_ps
. Существует много мифов о влиянии производительности на выравнивание памяти для инструкций SSE, поэтому я сделал небольшой тестовый пример того, что должно быть связанным циклом полосы пропускания памяти. Используя встроенную или невыровненную нагрузку, она выполняет 100 итераций через большой массив, суммируя элементы с внутренними функциями SSE. Исходный код
здесь. https://gist.github.com/rmcgibbo/7689820
Результаты на 64-битном MacBook Pro с Sandy Bridge Core i5 приведены ниже. Более низкие показатели указывают на более высокую производительность. Когда я прочитал результаты, я не вижу в основном никакого штрафа за производительность от использования _mm_loadu_ps в неизмененной памяти.
Я нахожу это удивительным. Является ли это справедливым тестом/обоснованным заключением? На каких аппаратных платформах есть разница?
$ 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