В чем разница между _mm_set1_ps и _mm_set_ps1? - PullRequest
3 голосов
/ 30 марта 2020

Есть ли разница между этими функциями? Если нет, то почему?

__m128 __mm_set1_ps(float a)
__m128 __mm_set_ps1(float a)

Оба описания одинаковы на веб-сайте Intel Intrinsics Guide . Спасибо.

1 Ответ

4 голосов
/ 30 марта 2020

Существует нулевая разница. _mm_set1_ps является идиоматическим c, используйте его.

например, xmmintrin.h из clang определяет set_ps1 в терминах set1_ps:

static __inline__ __m128 __DEFAULT_FN_ATTRS
_mm_set_ps1(float __w)
{
    return _mm_set1_ps(__w);
}

История догадка

Я предполагаю, что Intel просто не остановилась на схеме именования еще в первые дни SSE1 и переключилась на тип _mm_set1_ в будущем. Но если они уже зарегистрировали _mm_set_ps1, они не смогли бы его вернуть.

Обратите внимание, что нет _mm_set_epi321 или _mm_set_ep81 (к счастью)! Таким образом, _mm_set1_ps является идиоматическим c и следует той же схеме, что и другие встроенные трансляции, в то время как _mm_set_ps1 является необычным и удивит читателей. Хотя есть _mm_set_pd1 и _mm_load_pd1, и, предположительно, они были введены одновременно (с SSE2).

Я знаю об этом только потому, что наткнулся на него на днях, когда искал внутреннюю информацию. c, который будет выполнять вещательную загрузку со строгим псевдонимом, как вы могли бы с vpbroadcastd в asm. (Не существует портативного, который бы эффективно компилировал всюду; поддержка встроенных функций компилятором представляет собой смешанную пессимизацию мозговых мертвецов и отсутствие встроенных функций, когда вы пытаетесь сделать что-то сложное. Может быть, через несколько лет _mm_loadu_si32(void*) до нуля расширится как минимум быть широко поддерживаемым ..) / end off topi c rant.

...