Современный подход к созданию std :: vector для выравнивания памяти - PullRequest
11 голосов
/ 11 февраля 2020

следующий вопрос связан, однако ответы устарели, и комментарий пользователя Март c Glisse предполагает, что существуют новые подходы с C ++ 17 к этой проблеме, которые могут не будет должным образом обсуждаться.

Я пытаюсь заставить выровненную память работать должным образом для SIMD, все еще имея доступ ко всем данным.

В Intel, если я создаю вектор с плавающей точкой напечатайте __m256 и уменьшите мой размер в 8 раз, это даст мне выровненную память.

Например, std::vector<__m256> mvec_a((N*M)/8);

Немного хакерским способом я могу приводить указатели на векторные элементы to float, что позволяет мне получить доступ к отдельным значениям float.

Вместо этого я бы предпочел иметь std::vector<float>, который выровнен правильно, и, таким образом, может быть загружен в __m256 и другие типы SIMD без сегментации.

Я искал align_allo c.

Это может дать мне массив C, который правильно выровнен:

auto align_sz = static_cast<std::size_t> (32);
float* marr_a = (float*)aligned_alloc(align_sz, N*M*sizeof(float));

Однако я не уверен, как это сделать для * 1 028 *. Предоставление std::vector<float> владения marr_a не представляется возможным .

Я видел несколько предложений, что мне следует написать пользовательский распределитель , но это похоже на большую работу, и, возможно, с современным C ++ есть лучший способ?

1 Ответ

1 голос
/ 11 февраля 2020

Все контейнеры в стандартной библиотеке C ++, включая векторы, имеют необязательный параметр шаблона , который определяет распределитель контейнера , и реализовать свою собственную задачу не так уж много:

class my_awesome_allocator {
};

std::vector<float, my_awesome_allocator> awesomely_allocated_vector;

Вам придется написать немного кода, который реализует ваш распределитель, но он не будет намного больше кода, чем вы уже написали. Если вам не нужна поддержка до C ++ 17, вам нужно только реализовать методы allocate () и deallocate () , вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...