क्या यह अधिक प्रदर्शनकारी है?
यह बिल्कुल वैसा ही होना चाहिए। परिभाषा के अनुसार, यह एक साधारण समुच्चय है जिसमें इसके एकमात्र सदस्य के रूप में एक सरणी होती है।
स्थिति अधिक जटिल लगती है, जैसे std::array
हमेशा विशिष्ट प्लेटफॉर्म के आधार पर सी-सरणी की तुलना में समान असेंबली कोड का उत्पादन नहीं होता है।
मैंने गॉडबोल्ट पर इस विशिष्ट स्थिति का परीक्षण किया :
#include <array>
void test(double* const C, const double* const A,
const double* const B, const size_t size) {
for (size_t i = 0; i < size; i++) {
std::array<double, 2> arr = {0.e0};
for (size_t j = 0; j < size; j++) {
arr[0] += A[i] * B[j];
arr[1] += A[j] * B[i];
}
C[i] += arr[0];
C[i] += arr[1];
}
}
GCC और Clang , C-array संस्करण और a दोनों के लिए समान असेंबली कोड का उत्पादन करते हैंstd::array
।
MSVC और ICPC , हालांकि, प्रत्येक सरणी संस्करण के लिए अलग-अलग असेंबली कोड का उत्पादन करते हैं। (मैंने ICPC19 का परीक्षण किया -Ofast
और -Os
, MSVC -Ox
और -Os
)
मुझे पता नहीं है, ऐसा क्यों है (मैं वास्तव में std के समान व्यवहार की उम्मीद करूंगा :: सरणी और सी-सरणी)। हो सकता है कि अलग-अलग अनुकूलन रणनीतियाँ कार्यरत हों।
थोड़ा अतिरिक्त के रूप में: ICPC में एक बग के साथ लगता है
#pragma simd
कुछ स्थितियों में सी-सरणी का उपयोग करते समय वेक्टरकरण के लिए (सी-सरणी कोड एक गलत आउटपुट उत्पन्न करता है; std::array
संस्करण ठीक काम करता है)।
दुर्भाग्य से, मेरे पास अभी तक उस के लिए एक न्यूनतम काम करने का उदाहरण नहीं है, क्योंकि मैंने कोड की काफी जटिल टुकड़े को अनुकूलित करते हुए उस समस्या का पता लगाया था।
मैं इंटेल को बग-रिपोर्ट दर्ज करूंगा जब मुझे यकीन हो जाएगा कि मैंने सी-सरणी / std::array
और के बारे में कुछ गलत नहीं समझा #pragma simd
।