मेरे पास निम्न लूप है जिसे मैं आईसीसी के साथ संकलित कर रहा हूं

for (int i = 0; i < arrays_size; ++i) {
      total = total + C[i];
}

वैश्वीकरण रिपोर्ट कहती है कि इस लूप को वेक्टरकृत किया गया है लेकिन मुझे समझ में नहीं आता कि यह कैसे संभव है क्योंकि लेखन निर्भरता के बाद एक स्पष्ट पढ़ा गया है।

रिपोर्ट आउटपुट निम्न है:

LOOP BEGIN at loops.cpp(46,5)
      remark #15388: vectorization support: reference C has aligned access   [ loops.cpp(47,7) ]
      remark #15305: vectorization support: vector length 4
      remark #15399: vectorization support: unroll factor set to 8
      remark #15309: vectorization support: normalized vectorization overhead 0.475
      remark #15300: LOOP WAS VECTORIZED
      remark #15448: unmasked aligned unit stride loads: 1
      remark #15475: --- begin vector loop cost summary ---
      remark #15476: scalar loop cost: 5
      remark #15477: vector loop cost: 1.250
      remark #15478: estimated potential speedup: 3.990
      remark #15488: --- end vector loop cost summary ---
      remark #25015: Estimate of max trip count of loop=31250
   LOOP END

क्या कोई समझा सकता है कि इसका क्या अर्थ है और इस लूप को वेक्टर करना कैसे संभव है?

0
nightcrawler 21 नवम्बर 2020, 01:52

1 उत्तर

सबसे बढ़िया उत्तर

total और C[i] के प्रकार के आधार पर, आप जोड़ की संबद्धता और कम्यूटेटिविटी और पहले योग 4 या 8 (या अधिक) उप-योग का फायदा उठा सकते हैं।

int subtotal[4] = {0,0,0,0};
for (int i = 0; i < arrays_size; i+=4) {
    for(int k=0; k<4; ++k)
        subtotal[k] += C[i+k];
}
// handle remaining elements of C, if necessary ...
// sum-up sub-totals:
total = (subtotal[0]+subtotal[2]) + (subtotal[1]+subtotal[3]);

यह किसी भी पूर्णांक प्रकार के लिए काम करता है, लेकिन ICC डिफ़ॉल्ट रूप से मानता है कि फ़्लोटिंग पॉइंट जोड़ भी सहयोगी है (जीसीसी और क्लैंग को इसके लिए -ffast-math के कुछ सबसेट की आवश्यकता होती है)।

1
chtz 20 नवम्बर 2020, 23:30