Существует несколько вариантов для получения выстроенного блока памяти, но они очень похожи, и проблема в основном сводится к тому, на каком языке стандарт и платформы вы ориентируетесь.
С11
void * aligned_alloc (size_t alignment, size_t size)
POSIX
int posix_memalign (void **memptr, size_t alignment, size_t size)
Окна
void * _aligned_malloc(size_t size, size_t alignment);
И, конечно, это также всегда возможность выровнять вручную.
Intel предлагает еще один вариант.
Intel
void* _mm_malloc (int size, int align)
void _mm_free (void *p)
На основе исходного кода, выпущенного Intel, это, по-видимому, метод выделения согласованной памяти, которую предпочитают их инженеры, но я не могу найти документацию, сравнивающую ее с другими методами. Самое близкое, что я нашел, просто признает, что существуют другие выровненные подпрограммы распределения памяти.
Чтобы динамически выделить кусок выравниваемой памяти, используйте posix_memalign, который поддерживается GCC, а также компилятором Intel. Выгода Использование этого заключается в том, что вам не нужно менять API для удаления памяти. Вы можете использовать free(), как всегда. Но обратите внимание на Профиль параметра:
int posix_memalign (void ** memptr, size_t align, size_t size);
Компилятор Intel также предоставляет другой набор памяти API-интерфейсы. Программисты C/С++ могут использовать _mm_malloc и _mm_free для выделения и свободные выровненные блоки памяти. Например, следующее оператор запрашивает 64-байтовый выровненный блок памяти для 8 с плавающей запятой элементы.
farray = (float *) __ mm_malloc (8 * sizeof (float), 64);
Память, выделенная с помощью _mm_malloc, должна быть освобождена с помощью _mm_free. Вызов свободной памяти, выделенной _mm_malloc или вызывающей _mm_free в памяти, выделенной с помощью malloc, приведет к непредсказуемому поведению.
Четкие различия с точки зрения пользователя в том, что _mm_malloc
требует прямой поддержки ЦП и компилятора, а память, выделенная с помощью _mm_malloc
, должна быть освобождена с помощью _mm_free
. Учитывая эти недостатки, в чем причина использования _mm_malloc?
Может ли это иметь небольшое преимущество в производительности? Историческая катастрофа?