2014-01-17 1 views
1

Если в функции мне нужна фиксированная маска в случайном порядке, я должен установить ее как const или static const?SSE: Должен ли я установить маску в случайном порядке как статическую переменную или нет?

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); 
+0

Возможный дубликат [С ++ семантика \ 'static const \' vs \ 'const \'] (http://stackoverflow.com/questions/3709207/c-semantics-of-static-const-vs-const) –

+0

@Adriano Я не знаю, если это реальная разница, но я использую функцию для инициализации переменной, а не константу. В качестве побочного примечания функция не является статической функцией. – Antonio

+0

Если функция статическая или нет, IMO не имеет значения (поскольку это не имеет значения, если вы используете функцию или литералы, это не constexpr). Во всяком случае, я бы использовал static const, потому что на первый взгляд вы делаете это вычисление один раз (но здесь компилятор может быть намного умнее, чем мы ожидаем, поэтому проверка на сгенерированный код может быть более полезной, чем мои догадки). –

ответ

1

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

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

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

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

Смежные вопросы