یک برنامهٔ C++ بنویسید که با استفاده از std::atomic و چند نخ (std::thread) یک شمارندهٔ مشترک برای ثبت تعداد پردازشهای همزمان در یک سناریوی شبیهسازیشدهٔ بلادرنگ / HPC پیادهسازی کند و در پایان مقدار درست شمارنده را چاپ کند.
18.0 بازدید آخرین ویرایش در 198 روز قبل ساعت 01:16 0.0
برای حل این مسئله از هدر استفاده کرده و شمارنده را بهصورت std::atomic یا std::atomic تعریف کنید، سپس با std::thread چند نخ بسازید که در هر نخ در حلقهای چندین بار شمارنده را با ++ یا متد fetch_add(1) افزایش دهند؛ در پایان همهٔ نخها را join کرده و مقدار نهایی شمارنده را چاپ کنید. برای کارایی در محیطهای HPC میتوانید از memory_order_relaxed هنگام افزایش شمارنده استفاده کنید و از قفلهای سنگین (mutex) اجتناب کنید، همچنین برای آزمایش تعداد نخها و تکرارها را تغییر دهید و به احتمال سرریز شمارنده توجه کنید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
برای شمارندههای سادهی افزایشی در محیط HPC استفاده از std::atomic<uint64_t> با fetch_add(1, std::memory_order_relaxed) معمولاً بهترین کارایی را میدهد چون از قفل سنگین جلوگیری میکند، اما یادآوری کنید که memory_order_relaxed تنها اتمیک بودن را تضمین میکند و ترتیب عملیات را برقرار نمیکند. برای جلوگیری از ترافیک حافظه و false sharing میتوانید بهجای یک شمارندهٔ مشترک از شمارندههای محلی هر نخ استفاده کنید و در انتها آنها را جمع بزنید، که بهویژه وقتی تکرارها زیاد است کاراتر است. همچنین برای آزمایش روی ماشینهای واقعی تعداد نخها و تکرارها را متنوع کنید و همیشه نوع 64 بیتی برای جلوگیری از سرریز انتخاب کنید. اگر به ترتیب یا همگامسازی بین نخها نیاز دارید به جای relaxed از ordering قویتری مثل acquire/release یا seq_cst استفاده کنید.
گزارش