我花了很多周时间尝试使用英特尔SSE内在函数正确地手工绘制一段代码。但每次我遇到以下消息(打开-vec-report3之后):
(第810行)注释:循环未向量化:语句无法向量化。
我终于弄清楚这是因为我混合了两种数据类型__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
}
有人可以指出我正确的方向,以便在解决混合数据类型转换时克服这样的问题,以便于代码矢量化。