یک برنامهٔ 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) اجتناب کنید، همچنین برای آزمایش تعداد نخ‌ها و تکرارها را تغییر دهید و به احتمال سرریز شمارنده توجه کنید.

توسط پژوهشگر در 198 روز قبل ساعت 01:16
دسته بندی ها: C Plus Plus C Plus Plus for beginner
arman در 198 روز قبل ساعت 01:17

برای شمارنده‌های ساده‌ی افزایشی در محیط HPC استفاده از std::atomic<uint64_t> با fetch_add(1, std::memory_order_relaxed) معمولاً بهترین کارایی را می‌دهد چون از قفل سنگین جلوگیری می‌کند، اما یادآوری کنید که memory_order_relaxed تنها اتمیک بودن را تضمین می‌کند و ترتیب عملیات را برقرار نمی‌کند. برای جلوگیری از ترافیک حافظه و false sharing می‌توانید به‌جای یک شمارندهٔ مشترک از شمارنده‌های محلی هر نخ استفاده کنید و در انتها آنها را جمع بزنید، که به‌ویژه وقتی تکرارها زیاد است کاراتر است. همچنین برای آزمایش روی ماشین‌های واقعی تعداد نخ‌ها و تکرارها را متنوع کنید و همیشه نوع 64 بیتی برای جلوگیری از سرریز انتخاب کنید. اگر به ترتیب یا همگام‌سازی بین نخ‌ها نیاز دارید به جای relaxed از ordering قوی‌تری مثل acquire/release یا seq_cst استفاده کنید.

گزارش

1 پاسخ

جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من

در حال بارگیری...
ورود به حساب کاربری