2012-07-16 37 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

問題是你正試圖使用​​自動矢量化和手矢量化代碼。編譯器說該行不能被矢量化,因爲你不能矢量化一個矢量函數。

要麼讓編譯器自動向量化它,要麼禁用自動向量化並手動向量化代碼。正如已經評論的那樣,自動矢量化器將計算矢量化收益率:它會檢查是否值得向量化代碼。

相關問題