Мне нужно оптимизировать умножение матриц с помощью SIMD / Intel SSE. Приведенный пример кода выглядит так:
*x = (float*)memalign(16, size * sizeof(float));
Тем не менее, я использую C ++ и [found that][1]
Я вместо malloc
(прежде чем делать SIMD), я должен использовать new
, Теперь я продолжаю оптимизацию через SIMD / SSE, поэтому мне нужна выровненная память, поэтому вопрос: мне нужно memalign
/_aligned_malloc
или мой массив объявлен как
static float m1[SIZE][SIZE];
уже выровнены? (SIZE
это инт)
Как правило, они не будут выровнены по 16 байтам, хотя в спецификации C ++ нет ничего, что помешало бы вашему компилятору выровнять такой массив по 16-байтовой границе. В зависимости от того, какой компилятор вы используете, обычно есть специфичный для компилятора способ запросить выравнивание массива по 16-байтовой границе. Например, для gcc
, вы бы использовали:
static float m1[SIZE][SIZE] __attribute__((aligned(16)));
В качестве альтернативы, вы можете использовать posix_memalign()
, memalign()
или другие API с выравниванием выделения, доступные на вашей платформе, чтобы получить блок памяти с желаемым выравниванием. В худшем случае, вы могли бы даже выделить память, используя стандартные malloc()
или же operator new
а затем сами выполните регулировку выравнивания.
Других решений пока нет …