2012-07-16 18 views
11

Tôi đã vật lộn với vectơ hóa một ứng dụng cụ thể trong một thời gian và tôi đã thử mọi thứ. Từ tự động, để mã hóa nội tại SSE. Nhưng bằng cách nào đó tôi không thể có được tốc độ trên ứng dụng dựa trên stencil của tôi.Không thể phát hiện tại sao đoạn mã sau không được vectorized

Sau đây là một đoạn mã hiện tại của tôi, mà tôi đã vectorized bằng cách sử dụng nội tại SSE. Khi tôi biên dịch (Intel icc) nó sử dụng -vec-report3 Tôi liên tục nhận được thông báo này:
nhận xét: vòng lặp không được vectơ hóa: tuyên bố không thể được vector hóa.

#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); 

    } 

Tôi có thiếu thứ gì quan trọng không? Vì thông điệp không giải thích được tại sao nó không thể được vector hóa, tôi thấy khó xác định được nút cổ chai.

CẬP NHẬT: Sau khi xem xét cẩn thận các đề xuất, tôi đã chỉnh sửa mã theo cách sau. Tôi nghĩ tốt nhất là nên chia nhỏ hơn nữa, để xác định các phát biểu thực sự chịu trách nhiệm về sự phụ thuộc vectơ.

//#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 

    } 

Khi tôi biên dịch (ICC) mã trên mà không #pragma ivdep tôi nhận được thông báo sau:

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. 

Khi tôi biên dịch (ICC) nó với #pragma ivdep, tôi nhận được thông báo sau:

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

Tại sao có sự phụ thuộc được đề xuất cho Dòng 196? Làm thế nào tôi có thể loại bỏ sự phụ thuộc vectơ gợi ý?

+0

Đơn giản hóa cấu trúc 'for' bằng cách precomputing giá trị kết thúc và số vòng lặp. –

+0

Nó không thể vector hóa nó bởi vì bạn đã vector hóa nó. Bạn không nhận được bất kỳ tăng tốc nào vì tỷ lệ tính toán/truy cập bộ nhớ của bạn quá thấp. – Mysticial

+0

Nó không phải là sự liên kết đó là suy nghĩ đầu tiên của tôi (Mysticial sửa chữa tôi), nhưng nó chắc chắn giá trị bắt đầu bằng cách đơn giản hóa các biểu thức cho các offsets mảng. –

Trả lời

2

Vấn đề là bạn đang cố gắng sử dụng tự động vector hóa cùng với mã vectơ tay. Trình biên dịch nói rằng dòng không thể được vector hóa bởi vì bạn không thể vector hóa một hàm vectơ.

Hoặc cho phép trình biên dịch tự động vector hóa hoặc tắt tự động vector hóa và tự vector hóa mã của bạn. Như đã bình luận quá, các vectorizer tự động sẽ tính toán lợi nhuận vectorization: nó sẽ kiểm tra xem nó có giá trị hay không để vectorize mã của bạn.

Các vấn đề liên quan