Массивы инициализированы как `float [10] [10]`, уже выровнены по памяти для SIMD / SSE?

Мне нужно оптимизировать умножение матриц с помощью 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 это инт)

2

Решение

Как правило, они не будут выровнены по 16 байтам, хотя в спецификации C ++ нет ничего, что помешало бы вашему компилятору выровнять такой массив по 16-байтовой границе. В зависимости от того, какой компилятор вы используете, обычно есть специфичный для компилятора способ запросить выравнивание массива по 16-байтовой границе. Например, для gcc, вы бы использовали:

static float m1[SIZE][SIZE] __attribute__((aligned(16)));

В качестве альтернативы, вы можете использовать posix_memalign(), memalign()или другие API с выравниванием выделения, доступные на вашей платформе, чтобы получить блок памяти с желаемым выравниванием. В худшем случае, вы могли бы даже выделить память, используя стандартные malloc() или же operator new а затем сами выполните регулировку выравнивания.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector