混合2种不同的数据类型,防止代码矢量化

时间:2012-08-23 19:27:31

标签: c sse vectorization icc

我花了很多周时间尝试使用英特尔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
     }

有人可以指出我正确的方向,以便在解决混合数据类型转换时克服这样的问题,以便于代码矢量化。

0 个答案:

没有答案