выравнивание слова 4 байта для операций XOR - PullRequest
0 голосов
/ 20 декабря 2009

Есть ли преимущество в выполнении побитовых операций на границах слов? Любая оптимизация процессора или памяти при этом?

Актуальная проблема: Я пытаюсь создать XOR двух структур. Допустим, структура-1 и структура-2 имеют одинаковый размер 10000 байт. Я оставляю первые несколько сотен байтов как есть, а затем начинаю XOR с 1 и 2. Допустим, я начинаю с 302 для начала. Это займет 4 байта за раз и сделает XOR. 302, 303, 304 и 305 обеих структур будут XORed. Этот цикл будет повторяться до 10000.

Теперь, если я начну с 304, ожидается ли улучшение производительности?

Ответы [ 3 ]

4 голосов
/ 20 декабря 2009

Да, для правильного выравнивания есть как минимум два преимущества:

  1. Портативность. Не все процессоры поддерживают невыровненные числа. Для максимальной переносимости следует использовать только полностью выровненные (т. Е. N-байтовое целое число, начинающееся с адреса, кратного N) чисел
  2. Скорость. AFAIK, даже процессор, который поддерживает невыровненные числа, все еще быстрее с выровненными числами.
3 голосов
/ 20 декабря 2009

Преждевременная оптимизация - корень всего зла

Просто сделайте это простым способом, а затем оптимизируйте его, если ваш профилировщик скажет вам, что это важно.

Да, вы пойдете быстрее, если будете правильно выровнены. Вы пойдете еще быстрее, если будете использовать векторные инструкции XOR SSE2, при правильном выравнивании вы будете делать это по 16 байт за раз и не загрязнять кеш. И очень маловероятно, что оптимизация именно там, где вы должны тратить свое время.

1 голос
/ 20 декабря 2009

Некоторые процессоры допускают только 4-байтовые операции на границах 32-битных слов (некоторые разрешают их только на границах полуслов).

На этих процессорах доступ без выравнивания вызывает исключение процессора, которое - в зависимости от процессора, ОС и настроек - приведет к сбою процесса или просто большой работе для ОС.

На других процессорах (например, x86) вы просто получите удар по производительности, связанный с выполнением двух операций чтения и записи (плюс небольшой сдвиг) для каждой операции.

См. текст ссылки , чтобы увидеть проблемы с процессорами ARM

...