2012-07-16 17 views
11

मैं कुछ समय के लिए एक विशेष एप्लिकेशन को सदिश बनाने के लिए संघर्ष कर रहा हूं और मैंने सब कुछ करने की कोशिश की है। स्वचालन से, एसएसई intrinsics handcoded करने के लिए। लेकिन किसी भी तरह से मैं अपने स्टेनलेस आधारित आवेदन पर गति प्राप्त करने में असमर्थ हूं।यह पता लगाने में असमर्थ क्यों कोड का निम्नलिखित भाग वेक्टरकृत नहीं किया गया था

मेरे वर्तमान कोड का एक स्निपेट है, जिसे मैंने एसएसई इंट्रिनिक्स का उपयोग करके वेक्टरकृत किया है। जब मैं संकलित करता हूं (इंटेल आईसीसी) इसे -vec-report3 का उपयोग करके मैं लगातार यह संदेश प्राप्त करता हूं:
टिप्पणी: लूप वेक्टरकृत नहीं किया गया था: कथन को वेक्टरकृत नहीं किया जा सकता है।

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

    } 

Am मैं कुछ महत्वपूर्ण याद आ रही? चूंकि संदेश विस्तृत नहीं करता है कि इसे सदिश क्यों नहीं किया जा सकता है, इसलिए मुझे बाधा का पता लगाना मुश्किल लगता है।

अद्यतन: सुझावों पर सावधानीपूर्वक विचार करने के बाद, मैंने कोड को निम्न तरीके से tweaked। मैंने सोचा कि वास्तव में वेक्टर निर्भरता के लिए जिम्मेदार बयानों की पहचान करने के लिए इसे आगे तोड़ना सबसे अच्छा है।

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

    } 

जब मैं (आईसीसी) #pragma ivdep मैं निम्न संदेश मिलता है बिना ऊपर कोड संकलन: #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. 

जब मैं संकलन (आईसीसी) यह, मैं निम्न संदेश मिलता है:

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

लाइन 1 9 6 के लिए एक निर्भरता क्यों सुझाई गई है? मैं सुझाए गए वेक्टर निर्भरता को कैसे खत्म कर सकता हूं?

+0

अंत मूल्य और लूप की संख्या प्रीकंप्यूटिंग द्वारा 'के लिए' निर्माण को सरल बनाएं। –

+0

यह इसे सदिश नहीं कर सकता क्योंकि आपने इसे पहले से ही सदिशित किया है। आपको कोई गति नहीं मिल रही है क्योंकि आपकी गणना/मेमोरी-एक्सेस अनुपात बहुत कम है। – Mysticial

+0

यह संरेखण नहीं है जो मेरा पहला विचार था (रहस्यवादी मुझे सही किया गया), लेकिन सरणी ऑफसेट के लिए अभिव्यक्ति को सरल बनाकर यह निश्चित रूप से लायक है। –

उत्तर

2

समस्या यह है कि आप हाथ वेक्टरकृत कोड के साथ ऑटो-वेक्टरेशन का उपयोग करने की कोशिश कर रहे हैं। कंपाइलर का कहना है कि लाइन वेक्टरिज़ नहीं हो सकती है क्योंकि आप वेक्टर फ़ंक्शन को सदिश नहीं बना सकते हैं।

या तो कंपाइलर को स्वत: वेक्टरिज़ करने दें, या ऑटो वेक्टरेशन अक्षम करें और मैन्युअल रूप से अपने कोड को सदिश करें। जैसा कि पहले से ही टिप्पणी की गई है, ऑटो वेक्टरिज़र वेक्टरनाइज़ेशन लाभप्रदता की गणना करेगा: यह जांचता है कि क्या यह आपके कोड को सदिश बनाने के लिए योग्य है या नहीं।

संबंधित मुद्दे

 संबंधित मुद्दे