Сбой при использовании movapd с выровненной памятью - PullRequest
0 голосов
/ 20 марта 2019

У меня есть блок памяти, выделенный с помощью malloc с использованием 64-разрядного NASM в Windows. Когда я использую movapd (переместить два выровненных упакованных значения с плавающей запятой двойной точности), моя программа падает, но я могу использовать movupd (переместить два невыровненных упакованных числа с плавающей запятой двойной точности ценности).

Я изменил на _aligned_malloc, указав выравнивание = 16, которое работает для выделения памяти, но я все еще получаю ошибку, когда использую movapd . Перед выполнением инструкций мой отладчик показывает R8 = 0xB0FC78, R15 = 0x12FC0050, RCX = 0x6D40050 и RDX = 0x10010050. RCX и RDX являются указателями на два блока памяти. R8 и RCX являются счетчиками по блокам

Это работает:

movupd xmm0,[rdx+r8]
movupd [r15+rcx],xmm0

Вылетает:

movapd xmm0,[rdx+r8]
movapd [r15+rcx],xmm0

Как ни странно, программа медленнее с _aligned_malloc, чем с памятью malloc.

Мой код написан на NASM (ассемблере), но я не думаю, что язык имеет значение.

Почему я не могу использовать movapd даже с памятью, выделенной _aligned_malloc?

1 Ответ

0 голосов
/ 20 марта 2019

Вот ответ на этот вопрос в данном конкретном случае. После многоядерной обработки у меня есть четыре маленьких буфера для объединения в один большой буфер. Я использую SIMD для ускорения процесса.

Ниже приведены значения регистров, переданных на последний шаг (объединение), разделенные на 16.

7024645 0 714474,5 19906565 0 РЕЗЬБА 1

10285061 0 728618 19906565 714474,5 РЕЗЬБА 2

13414405 0 726064,5 19906565 1443092,5 РЕЗЬБА 3

16781317 0 724936 19906565 2169157 РЕЗЬБА 4

В третьем и пятом столбцах показаны значения, которые не делятся равномерно на 16, поэтому я не могу использовать выравниваемый доступ. Третий столбец - это размер небольшого буфера для этого потока. Причина "смещения" заключается в том, что программа возвращает неравное количество четырех слов для каждого сегмента, что означает, что окончательный результат может заканчиваться или не заканчиваться четным числом, кратным 16 - как простой пример, если у меня есть три четырех слова ( 24 байта), что не делится равномерно на 16.

Согласно этому сообщению в блоге, выравнивание памяти не оказывает существенного влияния на производительность на самых последних процессорах: https://lemire.me/blog/2012/05/31/data-alignment-for-speed-myth-or-reality/

Мне были бы интересны любые комментарии по этому поводу. Спасибо за помощь.

...