1

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

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

4

0 回答 0