Mar*_*son 6 c++ sse bit-manipulation simd absolute-value
我试图了解以下代码段的工作原理.该程序使用SIMD向量指令(Intel SSE)来计算4个浮点数的绝对值(因此,基本上,矢量化的"fabs()"函数).
这是片段:
#include <iostream>
#include "xmmintrin.h"
template <typename T>
struct alignas(16) sse_t
{
T data[16/sizeof(T)];
};
int main()
{
sse_t<float> x;
x.data[0] = -4.;
x.data[1] = -20.;
x.data[2] = 15.;
x.data[3] = -143.;
__m128 a = _mm_set_ps1(-0.0); // ???
__m128 xv = _mm_load_ps(x.data);
xv = _mm_andnot_ps(a,xv); // <-- Computes absolute value
sse_t<float> result;
_mm_store_ps(result.data, xv);
std::cout << "x[0]: " << result.data[0] << std::endl;
std::cout << "x[1]: " << result.data[1] << std::endl;
std::cout << "x[2]: " << result.data[2] << std::endl;
std::cout << "x[3]: " << result.data[3] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
现在,我知道它有效,因为我自己运行程序来测试它.使用g ++ 4.8.2编译时,结果是:
x[0]: 4
x[1]: 20
x[2]: 15
x[3]: 143
Run Code Online (Sandbox Code Playgroud)
三个(相关)问题困扰我:
首先,如何采用按位函数并将其应用于浮点数?如果我在vanilla C++中尝试这个,它告诉我这只适用于整数类型(这是有意义的).
但是,第二,更重要的是:它如何运作?如何服用NOT和AND甚至帮助你?在Python中尝试使用整数类型只会给出预期的结果:任何整数和-1(不是0),只是给你那个数字,但不会改变符号.那么它在这里如何运作?
第三,我注意到如果我改变用于NAND操作的浮点值(标有三个???),从-0.0到0.0,程序不再给我绝对值.但是-0.0怎么可能存在呢?它有什么帮助?
有用的参考:
-0.0表示为1000...0001.因此_mm_andnot_ps(-0.0, x)2相当于0111...111 & x.这会强制MSB(符号位)为0.
2. _mm_andnot_ps内在并不意味着"NAND"; 参见例如http://msdn.microsoft.com/en-us/library/68h7wd02(v=vs.90).aspx.
| 归档时间: |
|
| 查看次数: |
1358 次 |
| 最近记录: |