SSE: Должен ли я установить маску перемешивания как статическую переменную или нет?

Если в функции мне нужна фиксированная маска перемешивания, следует ли мне установить ее как const или static const?

const __m128i SHUFFLE_MASK = _mm_setr_epi8(0,  4,  8, 12, -1, -1, -1, -1,
                                           -1, -1, -1, -1, -1, -1, -1, -1);

static const __m128i SHUFFLE_MASK = _mm_setr_epi8(0,  4,  8, 12, -1, -1, -1, -1,
                                                  -1, -1, -1, -1, -1, -1, -1, -1);

person Antonio    schedule 17.01.2014    source источник
comment
возможный дубликат семантики C++ `static const` и `const`   -  person Adriano Repetti    schedule 17.01.2014
comment
@ Адриано Я не знаю, есть ли это реальная разница, но я использую функцию для инициализации переменной, а не константу. В качестве примечания, функция не является статической функцией.   -  person Antonio    schedule 17.01.2014
comment
Является ли функция статической или нет, IMO не имеет значения (поскольку не имеет значения, используете ли вы функцию или литеральные значения, это не constexpr). В любом случае, я бы использовал static const, потому что на первый взгляд вы делаете это вычисление один раз (но здесь компилятор может быть намного умнее, чем мы ожидаем, поэтому проверка сгенерированного кода может быть более полезной, чем мои предположения).   -  person Adriano Repetti    schedule 17.01.2014
comment
Я согласен с Адриано - проверьте сгенерированный код. В моем случае статическая константная переменная была намного хуже, потому что g++ генерировал код, чтобы каждый раз проверять, установлена ​​ли переменная. YMMV.   -  person Emil Styrke    schedule 08.04.2014


Ответы (1)


Обычно _mm_setr_epi8 данных с постоянным временем компиляции в конечном итоге компилируется в 16-битный фрагмент данных только для чтения, который загружается (или используется в качестве операнда памяти). (ищите метки типа .LC0 в выводе gcc -S asm). Это уже оптимально.

Эмиль Стирке прокомментировал, что static const может в конечном итоге включать код для проверки того, инициализировано ли уже статическое местоположение. Поскольку нет никакой выгоды и возможных затрат (по крайней мере, на более старых gcc, я сам не проверял), избегайте static const для векторов (особенно, когда объявление и инициализатор находятся внутри функции).

IDK, если gcc когда-либо оптимизирует setr, который имеет шаблон в данных, в movd и перемешивание или что-то в этом роде. Если это так, то вы можете потенциально захотеть избежать создания своей константы с инструкциями вместо того, чтобы иметь ее в качестве операнда памяти.

Хотя это кажется очень маловероятным случаем. Но если вам нужно победить такую ​​оптимизацию, вы, вероятно, можете сделать это, используя статический (файловый) массив char для хранения вашей константы и приведения указателя к векторному типу.

person Peter Cordes    schedule 02.08.2015