Динамическое размещение объектов с выровненными членами - возможные решения? - PullRequest
4 голосов
/ 09 февраля 2012

Я рассматриваю возможность использования SSE для ускорения кода в моем проекте.Это обычно требует 16-байтового выравнивания данных, над которыми я работаю.Для статического размещения я полагаю, что __declspec(align(16)) решает проблему, но моя проблема заключается в следующем: каков наилучший способ убедиться в этом при динамическом распределении?Особенно в тех случаях, когда выделенный объект не требует непосредственного выравнивания, а использует объекты с требованием выравнивания в качестве элементов (таким образом, намного проще забыть о том, что он правильно выровнен).Я предложил следующие решения:

  1. Всегда предполагайте, что любые потенциально не статически размещенные данные не выровнены, и используйте инструкции по выровненной загрузке.Из того, что я прочитал, это медленно, и, возможно, в этом случае вообще не стоит беспокоиться о SSE.Я могу реализовать это и проверить, как он работает, но я бы лучше спросил о лучших решениях, прежде чем вкладывать в него столько работы, чтобы просто выяснить, что оно того не стоит или что есть другое решение.

  2. Будьте очень осторожны и используйте только _aligned_malloc / _aligned_free для выделения любого объекта, который требует выравнивания, и любого объекта, который использует их в качестве членов.Это, вероятно, очень легко забыть и, следовательно, подвержено ошибкам.

  3. Перегрузка new / delete глобально и / или создание пользовательских функций malloc / free, которые выравнивают память изатем используйте их для всего.Однако, вероятно, не самая лучшая идея - выровнять буквально все , которое выделяется динамически.

  4. Создать базовый класс с перегруженными операторами new / delete, а затем выполнитьубедитесь, что любой класс, который требует выравнивания, и любой класс, который использует их как члены, наследуют его.Затем просто используйте new / delete для большинства / всех динамических распределений.Вероятно, менее подвержен ошибкам, чем 2.

  5. Каким-то другим способом, о котором я не думал или не знаю?

Параметры 1.-3.вероятно, не самые лучшие идеи.Как насчет 4.?Я ошибаюсь в чем-то, что упомянул?Предложения, мнения, полезные ссылки по этой теме?

Заранее спасибо:)

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

В Windows malloc выровнен по 16 байтов ( msdn ). Если ваша платформа malloc имеет более низкие требования к выравниванию, вам необходимо использовать выровненные версии malloc для объектов, используемых SSE.

РЕДАКТИРОВАТЬ: Если у вас есть определенный класс объектов, которые нуждаются в поддержке SSE, вы можете переопределить новый / удалить только для этого класса.

0 голосов
/ 09 февраля 2012

Не уверен, что это целесообразно для ваших целей, но вы можете использовать Doug Lea's allocator и определить макрос MALLOC_ALIGNMENT, чтобы удовлетворить ваши потребности (до 128 байтов).

Вам даже не нужно заменять распределитель по умолчанию - вы должны быть в состоянии использовать специфичные для Дуга Ли dlmalloc и dlfree только для ваших нужд SSE и продолжать использовать распределитель по умолчанию для всего остального.

...