Избегание ненужных нагрузок (SSE / AVX)

При компиляции для x64 следующая функция использует регистр XMM0 для передачи параметров:

void foo (double const scalar)
{
__m256d vector = _mm256_broadcast_sd(&scalar);
}

В сборке vbroadcastsd Код операции может принимать операнд регистра. Эквивалентная внутренняя функция, по-видимому, принимает только указатель на операнд памяти. Есть ли способ гарантировать, что компиляторы будут оптимизировать такие нагрузки, чтобы избежать сохранения в памяти?

0

Решение

Я не думаю, что кто-то может ГАРАНТИРОВАТЬ это, но, если вы включите хотя бы некоторую оптимизацию, я был бы очень разочарован, если бы какой-либо современный компилятор не удалил ненужные косвенные указатели … Я определенно видел более сложные проблемы, которые имеет компилятор разобрался как упростить.

Я так понимаю, вы не смотрели на сгенерированный код, чтобы определить, что он делает (потому что ваш вопрос был бы сформулирован иначе).

3

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

Если вас беспокоит передача параметров в стеке, то ваша функция, вероятно, слишком короткая или слишком важная, чтобы в конечном итоге вызываться как отдельная функция. использование

__forceinline

с визуальным C ++ или

__attribute__((always_inline))

с g ++.

0

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