C ++ - выровнять все выделенные двойные массивы по 32 байта - PullRequest
2 голосов
/ 28 июня 2019

У меня довольно большой код, и я хочу оптимизировать некоторые операции с помощью инструкций AVX.Согласно моим тестам, улучшение должно быть до 4x.

Однако в коде используются простые старые массивы (без std :: vector) с оператором new.

double * tmp = new double[size];

Проблема в том,для AVX мне нужны все двойные массивы, выровненные по границе 32 байта.Решение состоит в том, чтобы заменить все new на aligned_alloc (или _aligned_malloc в MSVC), а также заменить функции разблокировки соответствующими функциями.Проблема в том, что я должен пройти через весь код и найти все new, надеясь не забыть один, и в будущем все не должны забывать использовать выровненный локатор.

Есть ли другой способ?Я думал о перегрузке new оператор только для double, но я не уверен, если это правильный путь, и если так, как это сделать правильно / безопасно.

Я не могу переключиться на std::vectorс собственным выровненным локатором из-за некоторых внешних библиотек C-only, которые принимают массив в качестве входных параметров.

1 Ответ

4 голосов
/ 28 июня 2019

Есть ли другой способ?Да, _mm_loadu_* и _mm_storeu_*, где u обозначает невыровненный.

...