Я рассматриваю возможность использования SSE для ускорения некоторого кода в моем проекте. Обычно для этого требуется 16-байтовое выравнивание данных, над которыми я работаю. Для статического распределения я полагаю, что __declspec(align(16))
решает проблему, но моя проблема заключается в следующем: как лучше всего убедиться, что это так при выполнении динамических распределений? Особенно в тех случаях, когда выделенный объект не требует выравнивания напрямую, но использует объекты с требованием выравнивания в качестве членов (таким образом, гораздо проще забыть о том, чтобы убедиться, что он правильно выровнен). Я придумал следующие решения:
Всегда предполагайте, что любые потенциально нестатически размещенные данные не выровнены, и используйте невыровненные инструкции загрузки. Из того, что я читал, это медленно, и, возможно, в этом случае вообще не стоит заморачиваться с SSE. Я могу реализовать это и проверить, как оно работает, но я бы предпочел спросить о лучших решениях, прежде чем вкладывать в него столько труда, просто чтобы выяснить, что оно того не стоит или что есть другое решение.
Будьте очень осторожны и используйте только
_aligned_malloc
/_aligned_free
для выделения любого объекта, требующего выравнивания, и любого объекта, который использует их в качестве членов. Это, вероятно, очень легко забыть и, следовательно, подвержено ошибкам.Перегружайте
new
/delete
глобально и/или создавайте собственные функцииmalloc
/free
, которые выравнивают память, а затем используют их для всего. Однако, вероятно, не лучшая идея буквально выравнивать все, что выделяется динамически.Создайте базовый класс с перегруженными операторами
new
/delete
, затем убедитесь, что любой класс, требующий выравнивания, и любой класс, использующий их в качестве членов, наследует его. Затем просто используйтеnew
/delete
для большинства/всех динамических распределений. Вероятно, менее подвержен ошибкам, чем 2.Какой-то другой способ, о котором я не подумал или не знаю?
Варианты 1.-3. вероятно, не самые лучшие идеи. А 4.? Я ошибаюсь в чем-либо, что я упомянул? Предложения, мнения, полезные ссылки по этой теме?
Заранее спасибо :)
__declspec(align)
или подобное), то это мало что изменит. Если бы у меня был классFoo
, который нужно выровнять, я бы использовал__declspec(align(16))
в его определении, что правильно выровняло бы его для всех static распределений без необходимости явного выравнивания при использовании в качестве члена классаBar
. Однако это ничего не меняет для динамического распределения, и мне пришлось бы использовать одно из решений, которые я упомянул как дляFoo
, так и дляBar
, а также для любого другого класса, который использует любой из них в качестве членов. - person Curious Cpp User   schedule 09.02.2012