是否有用于学习英特尔SSE和AVX指令的优秀C/C++教程或示例?
我在微软MSDN和英特尔网站上发现很少,但从基础知识中理解它会很棒.
我有兴趣使用x86-64与gcc的SSE向量指令,并且不想为此使用任何内联汇编.有没有办法在C中做到这一点?如果是这样,有人可以举个例子吗?
为什么_mm_extract_ps
返回int
而不是float
?
float
从C中的XMM寄存器读取单个数据的正确方法是什么?
或者更确切地说,一种不同的方式是:与_mm_set_ps
指令相反的是什么?
我正在为二维卷积编写SSE代码,但SSE文档非常稀疏.我正在使用_mm_dp_ps计算点积并使用_mm_extract_ps来获得点积结果,但_mm_extract_ps返回表示浮点数的十六进制,我无法弄清楚如何将此十六进制浮点数转换为常规浮点数.我可以使用返回浮点数的__builtin_ia32_vec_ext_v4sf,但我想保持与其他编译器的兼容性.
_mm_extract_ps (__m128 __X, const int __N)
{
union { int i; float f; } __tmp;
__tmp.f = __builtin_ia32_vec_ext_v4sf ((__v4sf)__X, __N);
return __tmp.i;
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
感谢一点帮助.
OpenSUSE 11.2
GCC 4.4.1
C++
编译器选项
-fopenmp -Wall -O3 -msse4.1 -march = core2
链接器选项
-lgomp -Wall -O3 -msse4.1 -march = core2
我是SIMD编程的新手,我有一些基本的问题,我现在看了几天后似乎无法弄清楚.
我想要优化的代码基本上是一个简单但很大的算术公式,自动分析coude并行计算独立的乘法/加法应该相当简单,但我读到自动向量化仅适用于循环.
我已多次阅读,因为应该不惜一切代价避免通过联合或其他方式访问矢量中的单个元素,而应该替换为_mm_shuffle_pd(我只处理双打)...
我知道这是一个非常基本的问题,但我似乎并不知道如何将__m128d向量的内容存储为双精度而不将其作为联合访问.此外,与标量代码相比,这样的操作能否带来任何性能提升?
union {
__m128d v;
double d[2];
} vec;
union {
__m128d v;
double d[2];
} vec2;
vec.v = index1;
vec2.v = index2;
temp1 = _mm_mul_pd(temp1, _mm_set_pd(bvec[vec.d[1]], bvec[vec2[1]]));
Run Code Online (Sandbox Code Playgroud)
此外,两个工会看起来很丑陋,但在使用时
union dvec {
__m128d v;
double d[2];
} vec;
Run Code Online (Sandbox Code Playgroud)
试图将indexX声明为dvec,编译器抱怨dvec未声明
在我的一个应用程序中,我需要有效地对长数据流中的位进行解交织。理想情况下,我想使用BMI2 pext_u32()
和/或pext_u64()
x86_64内部指令(如果可用)。我在x86intrin.h
(GCC)上搜索了互联网上的文档,但在该主题上找不到太多东西;因此,我要求StackOverflow上的专家帮助我。
x86intrin.h
?pext_*()
背后是否已经有代码可以使用,还是我需要自己编写后备代码(用于条件编译)?pext_*()
-mbmi2
c ×4
sse ×4
gcc ×3
simd ×3
intrinsics ×2
x86-64 ×2
avx ×1
bmi ×1
c++ ×1
hex ×1
intel ×1
optimization ×1
sse2 ×1
terminology ×1
x86 ×1