এটা কি আরও পারফর্মেন্ট?
এটা ঠিক একই হওয়া উচিত। সংজ্ঞা অনুসারে, এটি একটি সাধারণ সদস্য যার একমাত্র সদস্য হিসাবে অ্যারে রয়েছে।
পরিস্থিতি আরও জটিল বলে মনে হচ্ছে, যেমন 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];
}
}
জিসিসি এবং ক্ল্যাং সি-অ্যারে সংস্করণ এবং সংস্করণ উভয়ের জন্য অভিন্ন সমাবেশ কোড উত্পাদন করে std::array
।
এমএসভিসি এবং আইসিপিসি , তবে প্রতিটি অ্যারে সংস্করণের জন্য আলাদা সমাবেশ কোড উত্পাদন করে code (আমি -Ofast
এবং -Os
; এমএসভিসি -Ox
এবং এর সাথে আইসিপিসি 19 পরীক্ষা করেছি -Os
)
আমার ধারণা নেই, কেন এটি কেস হয় (আমি সত্যই স্টাড :: অ্যারে এবং সি-অ্যারের একই রকম আচরণ আশা করবো)। হয়তো সেখানে বিভিন্ন অপ্টিমাইজেশন কৌশল নিযুক্ত করা হয়েছে।
সামান্য অতিরিক্ত হিসাবে: আইসিপিসিতে একটি বাগ রয়েছে বলে মনে হচ্ছে
#pragma simd
কিছু পরিস্থিতিতে সি-অ্যারে ব্যবহার করার সময় ভেক্টরাইজেশনের জন্য (সি-অ্যারে কোডটি একটি ভুল আউটপুট উত্পন্ন করে; std::array
সংস্করণটি ভাল কাজ করে)।
দুর্ভাগ্যক্রমে, আমার এখনও এটির জন্য ন্যূনতম কার্যকর উদাহরণ নেই, যেহেতু কোডের বেশ জটিল অংশটিকে অনুকূলিত করার সময় আমি এই সমস্যাটি আবিষ্কার করেছি।
আমি যখন নিশ্চিত হয়েছি যে আমি কেবল সি-অ্যারে / std::array
এবং সম্পর্কে কিছু ভুল বুঝি নি তখন আমি ইন্টেলের সাথে একটি বাগ-প্রতিবেদন ফাইল করব #pragma simd
।