我花了数周时间尝试使用英特尔 SSE 内在函数正确地手动矢量化一段代码。但是每次我一直遇到以下消息(打开-vec-report3后):
(第 810 行)备注:循环未矢量化:语句无法矢量化。
我终于发现这是因为我混合了 2 种数据类型 __m128(16 字节)和浮点数(4 字节)(下面代码中的数组v是浮点数*)。
这意味着由于左侧和右侧的数据类型不同,因此阻止了矢量化。
但是我不确定如何解决这个问题,因为对于 SSE 矢量化,我必须一次将 4 个浮点数加载到 __m128 变量中。同样,在第 818 行中将 4 个浮点数一起存储时,我也遇到了同样的问题。
#pragma ivdep
for ( i = 4; i < z - 4; i+=4 )
{
it = it2 + i;
__m128 tmp22 = _mm_loadu_ps(&v[it]); // Line 810
__m128 tmp23 = _mm_mul_ps(tmp22,tmp22);
__m128 tmp24 = _mm_loadu_ps(&tmp2[i]);
__m128 tmp25 = _mm_mul_ps(tmp23,tmp24);
__m128 tmp26 = _mm_loadu_ps(&p2[it]);
__m128 tmp27 = _mm_add_ps(_mm_mul_ps(tmp25,dt2_i),tmp26);
__m128 tmp28 = _mm_add_ps(tmp27,tmp26);
_mm_storeu_ps(&p1[it],_mm_sub_ps(tmp28,_mm_loadu_ps(&p1[it]))); // Line 818
}
有人可以请我指出正确的方向,以便在解决混合数据类型转换以促进代码矢量化时克服这样的问题。