Altivec - c ++, अनुकूलन, कंपाइलर-निर्माण, वेक्टरेशन, xlc के साथ आईबीएम एक्सएलसी कंपाइलर द्वारा लूप अनुकूलन

मैं बस Altivec के साथ खेल रहा थाहमारे पास एक पावर 6 क्लस्टर पर विस्तार है। मैंने देखा कि जब मैंने बिना किसी ऑप्टिमाइज़ेशन के कोड नीचे संकलित किया था, तो मेरी गति 4 थी जैसा कि मैं उम्मीद कर रहा था। हालांकि, जब मैंने इसे फिर से -ओ 3 ध्वज के साथ संकलित किया, तो मैंने 60 की गति प्राप्त करने में कामयाब रहे!

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

int main(void) {
const int m = 1000;

__vector signed int va;
__vector signed int vb;
__vector signed int vc;
__vector signed int vd;

int a[m];
int b[m];
int c[m];

for( int i=0 ; i < m ; i++ ) {
a[i] = i;
b[i] = i;
c[i] = 0;
}

for( int cnt = 0 ; cnt < 10000000 ; cnt++ ) {
vd = (__vector signed int){cnt,cnt,cnt,cnt};

for( int i = 0 ; i < m/4 ; i+=4 ) {
va = vec_ld(0, &a[i]);
vb = vec_ld(0, &b[i]);
vc = vec_add(vd, vec_add(va,vb));
vec_st(vc, 0, &c[i]);
}
}

std::cout << c[0] << ", " << c[1] << ", " << c[2] << ", " << c[3] << "n";

return 0;
}

उत्तर:

उत्तर № 1 के लिए 4

मैंने पावर 7 पर कुछ सामान किया है, और मैंने एक्सएलसी कंपाइलर के साथ बहुत ही अजीब चीजें देखी हैं। लेकिन इस तरह के अजीब नहीं! (कम से कम 60x नहीं ...)

पावरपीसी श्रृंखला (कम से कम Power6 और Power7 के लिए) के बारे में ध्यान देने योग्य बात यह है कि निर्देश विलंबता बहुत लंबी है और x86 / x64 की तुलना में आउट ऑफ़ ऑर्डर निष्पादन बहुत कमजोर है।

इसलिए, आंतरिक लूप (जैसा कि आपके कोड में लिखा गया है) बहुत कम आईपीसी प्राप्त करेगा।

अब, एकमात्र तरीका मैं कल्पना कर सकता हूं कि आपको 60x स्पीडअप मिल रहा है कि आंतरिक लूप है पूरी तरह से अनियंत्रित ओओ 3। यह संभव है क्योंकि आंतरिक पाश की यात्रा गणना को 63 के रूप में स्थिर रूप से निर्धारित किया जा सकता है।

अनलॉक करना कि आंतरिक लूप मूल रूप से पूरे पाइपलाइन को भरने की अनुमति देगा।

बेशक मैं बस अनुमान लगा रहा हूं। आपकी सबसे अच्छी शर्त असेंबली को देखना है।

इसके अलावा, आप इसे कैसे समय दे रहे हैं? पावरपीसी पर मैंने देखा है कि बहुत अजीब व्यवहार टाइमर से है ...

संपादित करें:

चूंकि आपका नमूना कोड काफी सरल है, इसलिए यह खोजना बहुत आसान होना चाहिए (असेंबली में) चाहे वह आंतरिक लूप आंशिक रूप से या पूरी तरह से अनियंत्रित हो।


संबंधित सवाल
सबसे लोकप्रिय