Tag: sse

混合SSE整数/浮点SIMD指令时,是否会降低性能?

我最近以内在函数的forms使用了x86 SIMD指令(SSE1234)。 我发现令人沮丧的是SSE ISA有几个简单的指令,只能用于浮点数或仅用于整数,但理论上应该对两者都有相同的效果。 例如,float和double向量都有指令从地址( movhps , movhpd )加载更高的64位128位向量,但是没有这样的整数向量指令。 我的问题: 在整数向量上使用浮点指令时,有没有理由期望性能受到影响,例如使用movhps将数据加载到整数向量? 我写了几个测试来检查,但我认为他们的结果不可信。 编写一个正确的测试来探索这些事情的所有极端情况真的很难,特别是在这里最可能涉及指令调度时。 相关问题: 其他平凡相似的东西也有几个基本相同的指令。 例如,我可以使用por , orps或orpd按位OR。 任何人都可以解释这些附加说明的目的是什么? 我想这可能与应用于每条指令的不同调度算法有关。

打印__m128i变量

我正在尝试学习使用内在函数进行编码,下面是一个添加代码的代码 compiler used: icc #include #include int main() { __m128i a = _mm_set_epi32(1,2,3,4); __m128i b = _mm_set_epi32(1,2,3,4); __m128i c; c = _mm_add_epi32(a,b); printf(“%d\n”,c[2]); return 0; } 我得到以下错误: test.c(9): error: expression must have pointer-to-object type printf(“%d\n”,c[2]); 如何在变量c打印__m128i类型的__m128i

如何在没有编译器浪费指令归零上层元素的情况下将标量合并到向量中? 英特尔内在函数的设计限制?

我没有特定的用例; 我问这是否真的是英特尔内在函数中的设计缺陷/限制,或者我是否只是遗漏了某些内容。 如果你想将标量浮点数与现有向量相结合,那么使用英特尔内在函数时,如果没有高元素归零或将标量广播到向量中,似乎没有办法实现。 我没有研究过GNU C本机向量扩展和相关的内置函数。 如果额外的内在优化,这不会太糟糕,但它不与gcc(5.4或6.2)。 使用pmovzx或insertps作为载荷也没有好的方法,因为它们的内在函数只采用向量args的相关原因。 (并且gcc不会将标量 – >向量加载到asm指令中。) __m128 replace_lower_two_elements(__m128 v, float x) { __m128 xv = _mm_set_ss(x); // WANTED: something else for this step, some compilers actually compile this to a separate insn return _mm_shuffle_ps(v, xv, 0); // lower 2 elements are both x, and the garbage is gone } gcc 5.3 […]