मै मैट्रिक्स में एक अजीब प्रदर्शन समस्या में आया बेंचमार्क (MOSBENCH सूट से मेटिस में matrix_mult)। बेंचमार्क को डेटा को टाइल करने के लिए अनुकूलित किया गया था कि सक्रिय कामकाजी सेट 12kb (32x32 इंच की 3 टाइल्स) था और एल 1 कैश में फिट होगा। एक लंबी कहानी को कम करने के लिए, आंतरिक दो सबसे लूपों को स्वैप करने के लिए कुछ सरणी इनपुट आकार (4096, 8192) पर लगभग 4x का प्रदर्शन अंतर था और दूसरों पर 30% अंतर था। समस्या अनिवार्य रूप से एक स्ट्रॉइड पैटर्न में बनाम तत्वों तक पहुंचने के लिए नीचे आ गई। कुछ सरणी आकारों में मुझे लगता है कि एक खराब घुमावदार पहुंच उत्पन्न हुई जिसने बहुत सी कैश लाइन टकराव उत्पन्न किए। 2-तरफा सहयोगी एल 1 से 8-तरफा सहयोगी एल 1 में बदलते समय प्रदर्शन अंतर काफी कम होता है।संकलक नेस्टेड लूप अनुकूलन।
मेरा प्रश्न यह है कि अनुक्रमिक मेमोरी एक्सेस को अधिकतम करने के लिए जीओसी ऑप्टिमाइज़ लूप ऑर्डरिंग क्यों नहीं करता है?
नीचे समस्या का एक सरलीकृत संस्करण है (ध्यान दें कि प्रदर्शन का समय एल 1 कॉन्फ़िगरेशन पर अत्यधिक निर्भर है। नीचे दिखाए गए नंबर 2.3 गीगाहर्ट्ज एएमडी सिस्टम से हैं 64-एल 1 2-वे-साथ सहयोगी -ओ 3 के साथ संकलित)।
N = ARRAY_SIZE // 1024
int* mat_A = (int*)malloc(N*N*sizeof(int));
int* mat_B = (int*)malloc(N*N*sizeof(int));
int* mat_C = (int*)malloc(N*N*sizeof(int));
// Elements of mat_B are accessed in a stride pattern of length N
// This takes 800 msec
for (int t = 0; t < 1000; t++)
for (int a = 0; a < 32; a++)
for (int b = 0; b < 32; b++)
for (int c = 0; c < 32; c++)
mat_C[N*a+b] += mat_A[N*a+c] * mat_B[N*c+b];
// Inner two loops are swapped
// Elements are now accessed sequentially in inner loop
// This takes 172 msec
for (int t = 0; t < 1000; t++)
for (int a = 0; a < 32; a++)
for (int c = 0; c < 32; c++)
for (int b = 0; b < 32; b++)
mat_C[N*a+b] += mat_A[N*a+c] * mat_B[N*c+b];
क्योंकि संकलक के लिए यह साबित करना बहुत मुश्किल है कि इस तरह के परिवर्तन ऑपरेशन के अर्थशास्त्र को नहीं बदलते हैं। – Sven
शायद आपको google gcc + graphite के लिए यह दिलचस्प लगेगा, जो पॉलीहेड्रल मॉडल के आधार पर लूप ट्रांसफॉर्मेशन के लिए अब विलय वाली शाखा थी। कहीं संभावित परिवर्तनों की एक सूची है। –
मुझे लगता है कि चूंकि पूर्णांक जोड़ना कम्यूटिक है क्योंकि यह एक संकलक के लिए यह साबित करना काफी आसान होगा कि ऑपरेशन लूपर ऑर्डरिंग के लिए परिवर्तनीय है। मैं सोच रहा हूं कि यह कोड उदाहरण के बारे में क्या है जो इसे अनुकूलित करने के लिए गैर-तुच्छ बनाता है। – Mark