следующий вопрос связан, однако ответы устарели, и комментарий пользователя Март 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 ++ есть лучший способ?