- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
SSE 内在函数包括 _mm_shuffle_ps xmm1 xmm2 immx
允许从 xmm1
中选取 2 个元素与来自 xmm2
的 2 个元素连接.然而,这是针对浮点数,(由 _ps 暗示,打包单个)。但是,如果您转换压缩整数 __m128i ,那么你也可以使用 _mm_shuffle_ps :
#include <iostream>
#include <immintrin.h>
#include <sstream>
using namespace std;
template <typename T>
std::string __m128i_toString(const __m128i var) {
std::stringstream sstr;
const T* values = (const T*) &var;
if (sizeof(T) == 1) {
for (unsigned int i = 0; i < sizeof(__m128i); i++) {
sstr << (int) values[i] << " ";
}
} else {
for (unsigned int i = 0; i < sizeof(__m128i) / sizeof(T); i++) {
sstr << values[i] << " ";
}
}
return sstr.str();
}
int main(){
cout << "Starting SSE test" << endl;
cout << "integer shuffle" << endl;
int A[] = {1, -2147483648, 3, 5};
int B[] = {4, 6, 7, 8};
__m128i pC;
__m128i* pA = (__m128i*) A;
__m128i* pB = (__m128i*) B;
*pA = (__m128i)_mm_shuffle_ps((__m128)*pA, (__m128)*pB, _MM_SHUFFLE(3, 2, 1 ,0));
pC = _mm_add_epi32(*pA,*pB);
cout << "A[0] = " << A[0] << endl;
cout << "A[1] = " << A[1] << endl;
cout << "A[2] = " << A[2] << endl;
cout << "A[3] = " << A[3] << endl;
cout << "B[0] = " << B[0] << endl;
cout << "B[1] = " << B[1] << endl;
cout << "B[2] = " << B[2] << endl;
cout << "B[3] = " << B[3] << endl;
cout << "pA = " << __m128i_toString<int>(*pA) << endl;
cout << "pC = " << __m128i_toString<int>(pC) << endl;
}
vshufps $228, 16(%rsp), %xmm1, %xmm0
vpaddd 16(%rsp), %xmm0, %xmm2
vmovdqa %xmm0, 32(%rsp)
vmovaps %xmm0, (%rsp)
vmovdqa %xmm2, 16(%rsp)
call __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
....
最佳答案
没有等效于 _mm_shuffle_ps
对于整数。在这种情况下,要达到相同的效果,您可以执行以下操作
上证二
*pA = _mm_shuffle_epi32(_mm_unpacklo_epi32(*pA, _mm_shuffle_epi32(*pB, 0xe)),0xd8);
*pA = _mm_blend_epi16(*pA, *pB, 0xf0);
*pA = _mm_castps_si128(
_mm_shuffle_ps(_mm_castsi128_ps(*pA),
_mm_castsi128_ps(*pB), _MM_SHUFFLE(3, 2, 1 ,0)));
The bypass delay is important in long dependency chains where latency is a bottleneck, but not where it is throughput rather than latency that matters.
shufps
通常不会受到惩罚。在大多数整数向量指令之间。阿格纳 说:
For example, I found no delay when mixing
PADDD
andSHUFPS
[on Sandybridge].
SHUFPS
,但即便如此,只有一个
SHUFPS
通常仍然比多个其他指令更快。额外的指令也有延迟,并且会降低吞吐量。
PSHUFD
(
_mm_shuffle_epi32
) 而不是
SHUFPS
(
_mm_shuffle_ps
) 在浮点域中会导致四个时钟周期的旁路延迟。在示例 8.3b 中,他使用 SHUFPS 来消除延迟(在他的示例中有效)。
SHUFPS
之间没有延迟。或
PSHUFD
(参见第 140 页)。
关于sse - 在整数向量上使用 _mm_shuffle_ps 的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26983569/
SSE 内在函数包括 _mm_shuffle_ps xmm1 xmm2 immx允许从 xmm1 中选取 2 个元素与来自 xmm2 的 2 个元素连接.然而,这是针对浮点数,(由 _ps 暗示,打包
有时(不总是)当我在项目中包含我的数学头文件时,编译器会提示(尝试过 gcc 和 clang)_mm_shuffle_ps和 _mm_shuffle_pd即使设置了所有编译器标志 (-msse -ms
_mm_shuffle_ps() 内在函数允许将浮点输入交错为输出的低 2 float 和高 2 float 。 例如: R = _mm_shuffle_ps(L1, H1, _MM_SHUFFLE(
如果我的理解正确的话 _mm_movehdup_ps(a) 给出相同的结果 _mm_shuffle_ps(a, a, _MM_SHUFFLE(1, 1, 3, 3)) ? 两者有性能差异吗? 最佳答案
我正在尝试将 SSE 编写的代码转换为 NEON SIMD,但由于 _mm_shuffle_ps SSE 内在函数而陷入困境。这是代码: b = _mm_shuffle_ps(a, b, 136);
我是一名优秀的程序员,十分优秀!