我要优化的代码基本上是一个简单但很大的算术公式,自动分析代码以并行计算独立的乘法/加法应该相当简单,但我读到自动向量化仅适用于循环。
我现在已经读过很多次了,应该不惜一切代价避免通过联合或其他方式访问向量中的单个元素,而应该用 _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]]));
另外,这两个工会看起来丑陋可笑,但是在使用时
union dvec {
__m128d v;
double d[2];
} vec;
试图将 indexX 声明为 dvec,编译器抱怨 dvec 未声明。