不同类型的逻辑SSE内部函数之间有什么区别吗?例如,如果采用或运算,则有三个内部函数:_mm_或_ps、_mm_或_pd和_mm_或_si128,它们都执行相同的操作:按位计算或运算其操作数。我的问题:
使用一个或另一个内部函数(使用适当的类型转换)有什么区别吗?在某些特定情况下,会不会有像延长执行时间这样的隐性成本?
这些内部函数映射到三个不同的x86指令(por、orps、orpd)。有人知道英特尔为什么要浪费宝贵的操作码空间来编写多条指令吗?

最佳答案

我认为这三种操作实际上都是一样的,即128位按位操作。不同形式存在的原因可能是历史性的,但我不能肯定。我想在浮点版本中可能会有一些额外的行为,例如当有nan时,但这纯粹是猜测。对于正常输入,指令似乎是可互换的,例如。

#include <stdio.h>
#include <emmintrin.h>
#include <pmmintrin.h>
#include <xmmintrin.h>

int main(void)
{
    __m128i a = _mm_set1_epi32(1);
    __m128i b = _mm_set1_epi32(2);
    __m128i c = _mm_or_si128(a, b);

    __m128 x = _mm_set1_ps(1.25f);
    __m128 y = _mm_set1_ps(1.5f);
    __m128 z = _mm_or_ps(x, y);

    printf("a = %vld, b = %vld, c = %vld\n", a, b, c);
    printf("x = %vf, y = %vf, z = %vf\n", x, y, z);

    c = (__m128i)_mm_or_ps((__m128)a, (__m128)b);
    z = (__m128)_mm_or_si128((__m128i)x, (__m128i)y);

    printf("a = %vld, b = %vld, c = %vld\n", a, b, c);
    printf("x = %vf, y = %vf, z = %vf\n", x, y, z);

    return 0;
}

$ gcc -Wall -msse3 por.c -o por

$ ./por

a = 1 1 1 1, b = 2 2 2 2, c = 3 3 3 3
x = 1.250000 1.250000 1.250000 1.250000, y = 1.500000 1.500000 1.500000 1.500000, z = 1.750000 1.750000 1.750000 1.750000
a = 1 1 1 1, b = 2 2 2 2, c = 3 3 3 3
x = 1.250000 1.250000 1.250000 1.250000, y = 1.500000 1.500000 1.500000 1.500000, z = 1.750000 1.750000 1.750000 1.750000

关于c - 逻辑SSE内部函数之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2804902/

10-11 08:22