मैं कुछ समय के लिए एक विशेष एप्लिकेशन को सदिश बनाने के लिए संघर्ष कर रहा हूं और मैंने सब कुछ करने की कोशिश की है। स्वचालन से, एसएसई 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 के लिए एक निर्भरता क्यों सुझाई गई है? मैं सुझाए गए वेक्टर निर्भरता को कैसे खत्म कर सकता हूं?
अंत मूल्य और लूप की संख्या प्रीकंप्यूटिंग द्वारा 'के लिए' निर्माण को सरल बनाएं। –
यह इसे सदिश नहीं कर सकता क्योंकि आपने इसे पहले से ही सदिशित किया है। आपको कोई गति नहीं मिल रही है क्योंकि आपकी गणना/मेमोरी-एक्सेस अनुपात बहुत कम है। – Mysticial
यह संरेखण नहीं है जो मेरा पहला विचार था (रहस्यवादी मुझे सही किया गया), लेकिन सरणी ऑफसेट के लिए अभिव्यक्ति को सरल बनाकर यह निश्चित रूप से लायक है। –