Avatar ·

لماذا الجمع العنصري في حلقتين منفصلتين أسرع بكثير من حلقة واحدة مدمجة؟

مرحبًا أيها الزملاء! أكتب بلغة C++ منذ عدة سنوات، لكنني مؤخرًا صادفت سلوك أداء غريب جدًا لا أستطيع تفسيره. لدي مصفوفتان: `a` و `b` بحجم 20 مليون عنصر لكل منهما. أريد أولاً جمعهما عنصريًا وكتابة النتيجة في مصفوفة `c`، ثم جمع عناصر المصفوفة `c` مع المصفوفة `d` وكتابتها في مصفوفة `e`. كتبت نسختين من الكود: الأولى بحلقتين منفصلتين، والثانية بحلقة واحدة مدمجة. إليك الكود: ```cpp #include #include #include const size_t N = 20000000; int main() { std::vector a(N, 1); std::vector b(N, 2); std::vector c(N); std::vector d(N, 3); std::vector e(N); // الخيار 1: حلقتان منفصلتان auto start1 = std::chrono::high_resolution_clock::now(); for (size_t i = 0; i < N; ++i) { c[i] = a[i] + b[i]; } for (size_t i = 0; i < N; ++i) { e[i] = c[i] + d[i]; } auto end1 = std::chrono::high_resolution_clock::now(); std::chrono::duration elapsed1 = end1 - start1; std::cout << "حلقتان منفصلتان: " << elapsed1.count() << " ثانية\n"; // الخيار 2: حلقة واحدة مدمجة auto start2 = std::chrono::high_resolution_clock::now(); for (size_t i = 0; i < N; ++i) { c[i] = a[i] + b[i]; e[i] = c[i] + d[i]; } auto end2 = std::chrono::high_resolution_clock::now(); std::chrono::duration elapsed2 = end2 - start2; std::cout << "حلقة واحدة مدمجة: " << elapsed2.count() << " ثانية\n"; return 0; } ``` النتائج على جهازي (مع تحسينات O2) كانت: الحلقتان المنفصلتان حوالي 0.12 ثانية، والحلقة الواحدة المدمجة حوالي 0.18 ثانية. لماذا الحلقتان المنفصلتان أسرع؟ أعتقد أن الأمر يتعلق بتخزين cache أو pipeline، لكني لست متأكدًا. هل يمكن لأحد أن يشرح؟