Значение offset
(и, следовательно, i + offset
) не всегда будет кратным 8 (в приведенном выше примере оно равно 0, 3089, 6178, 9267), поэтому ваши встроенные функции загрузки и хранения будутв общем случае не выровняйте.
Самое простое решение - использовать _mm256_loadu_ps
вместо _mm256_load_ps
и _mm256_storeu_ps
вместо _mm256_store_ps
.
.работать на вашем MacBook Pro, я предполагаю, что clang генерирует невыровненные инструкции по загрузке / хранению за вашей спиной, тем самым скрывая проблему, пока вы не попытаетесь запустить код в системе с другим компилятором.
Обновление: Iтолько что подтвердил приведенную выше гипотезу, скомпилировав и разобрав сгенерированный код (на Haswell MacBook Pro с macOS 10.13.4 и Xcode 9.3.1):
>>> vmovups (%r14,%r13,4), %ymm0
vsubps 192(%rsp), %ymm0, %ymm0 ## 32-byte Folded Reload
vmulps 448(%rsp), %ymm0, %ymm0 ## 32-byte Folded Reload
vdivps 384(%rsp), %ymm0, %ymm0 ## 32-byte Folded Reload
vaddps 416(%rsp), %ymm0, %ymm0 ## 32-byte Folded Reload
>>> vmovups %ymm0, (%r14,%r13,4)
Обратите внимание на использование vmovups
вместо vmovaps
.