2012-07-16 36 views
11

我一直在努力向量化某个特定的应用程序,现在我已经尝试了一切。从自动矢量化到手动编码的SSE内部函数。但不知何故,我无法在基于模板的应用程序上获得加速。无法检测为什么下面的代码片段不是矢量化的

以下是我使用SSE intrinsics矢量化的当前代码片段。当我使用-vec-报告3把它编译(英特尔ICC)我经常得到这样的信息:
注:循环不矢量:语句不能量化。

#pragma ivdep 
    for (i = STENCIL; i < z - STENCIL; i+=4) 
    { 
    it = it2 + i; 

    __m128 tmp2i = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j4+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j4+k*it_k])),X4_i); //loop was not vectorized: statement cannot be vectorized 
    __m128 tmp3 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j3+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j3+k*it_k])),X3_i); 
    __m128 tmp4 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j2+k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j2+k*it_k])),X2_i); 
    __m128 tmp5 = _mm_mul_ps(_mm_add_ps(_mm_load_ps(&p2[i+j*it_j-it_j +k*it_k]),_mm_load_ps(&p2[i+j*it_j+it_j +k*it_k])),X1_i); 

    __m128 tmp6 = _mm_add_ps(_mm_add_ps(_mm_add_ps(tmp2i,tmp3),_mm_add_ps(tmp4,tmp5)), _mm_mul_ps(_mm_load_ps(&p2[it]),C00_i)); 

    _mm_store_ps(&tmp2[i],tmp6); 

    } 

我这么想的关键?由于该消息没有详细说明为什么它不能被矢量化,所以我发现很难确定瓶颈。

更新: 在仔细考虑了这些建议之后,我按以下方式调整了代码。我认为最好将其进一步分解,以确定实际导致向量依赖性的语句。

//#pragma ivdep 
    for (i = STENCIL; i < z - STENCIL; i+=4) 
    { 
    it = it2 + i; 
    __m128 center = _mm_mul_ps(_mm_load_ps(&p2[it]),C00_i); 

    u_j4 = _mm_load_ps(&p2[i+j*it_j-it_j4+k*it_k]); //Line 180 
    u_j3 = _mm_load_ps(&p2[i+j*it_j-it_j3+k*it_k]); 
    u_j2 = _mm_load_ps(&p2[i+j*it_j-it_j2+k*it_k]); 
    u_j1 = _mm_load_ps(&p2[i+j*it_j-it_j +k*it_k]); 
    u_j8 = _mm_load_ps(&p2[i+j*it_j+it_j4+k*it_k]); 
    u_j7 = _mm_load_ps(&p2[i+j*it_j+it_j3+k*it_k]); 
    u_j6 = _mm_load_ps(&p2[i+j*it_j+it_j2+k*it_k]); 
    u_j5 = _mm_load_ps(&p2[i+j*it_j+it_j +k*it_k]); 

    __m128 tmp2i = _mm_mul_ps(_mm_add_ps(u_j4,u_j8),X4_i); 
    __m128 tmp3 = _mm_mul_ps(_mm_add_ps(u_j3,u_j7),X3_i); 
    __m128 tmp4 = _mm_mul_ps(_mm_add_ps(u_j2,u_j6),X2_i); 
    __m128 tmp5 = _mm_mul_ps(_mm_add_ps(u_j1,u_j5),X1_i); 

    __m128 tmp6 = _mm_add_ps(_mm_add_ps(tmp2i,tmp3),_mm_add_ps(tmp4,tmp5)); 
    __m128 tmp7 = _mm_add_ps(tmp6,center); 

    _mm_store_ps(&tmp2[i],tmp7); //Line 196 

    } 

当我编译(ICC),而不#pragma ivdep我得到以下信息上面的代码:

remark: loop was not vectorized: existence of vector dependence. 
vector dependence: assumed FLOW dependence between tmp2 line 196 and tmp2 line 196. 
vector dependence: assumed ANTI dependence between tmp2 line 196 and tmp2 line 196. 

当我编译(ICC)它与#pragma ivdep,得到以下信息:

remark: loop was not vectorized: unsupported data type. //Line 180 

为什么第196行有一个依赖关系?我如何消除建议的矢量依赖性?

+0

通过预计算最终值和循环次数来简化'for'构造。 – 2012-07-16 19:38:58

+0

无法对其进行矢量化,因为您已经对其进行了矢量化。你的计算/内存访问比率太低,你没有得到任何加速。 – Mysticial 2012-07-16 19:57:06

+0

这不是我第一次想到的对齐方式(Mysticial纠正了我),但绝对值得从简化数组偏移表达式开始。 – 2012-07-16 20:10:50

回答

2

问题是你正试图使用​​自动矢量化和手矢量化代码。编译器说该行不能被矢量化,因为你不能矢量化一个矢量函数。

要么让编译器自动向量化它,要么禁用自动向量化并手动向量化代码。正如已经评论的那样,自动矢量化器将计算矢量化收益率:它会检查是否值得向量化代码。

相关问题