یک برنامه C++ بنویسید که با استفاده از std::thread (هدر ) یک آرایه بزرگ از اعداد صحیح را به چند بخش تقسیم کند، هر بخش را در یک ترد جداگانه جمع زده و حاصل جمع کلی را چاپ کند.
2.0 بازدید آخرین ویرایش در 221 روز قبل ساعت 01:27 0.0
برای حل، یک std::vector پر از اعداد بسازید، تعداد تردها را مشخص کنید و اندازه بلوک هر ترد را محاسبه نمایید؛ سپس برای هر بلوک یک std::thread ایجاد کرده و مجموع جزئی را در یک متغیر مشترک یا در یک بردار نتایج ذخیره کنید و در پایان همه تردها را با join() منتظر بمانید و جمع نهایی را محاسبه کنید. از هدر استفاده کنید و برای جلوگیری از شرایط رقابتی از روشهایی مثل ذخیره مقادیر جزئی در یک بردار و جمع نهایی در ترد اصلی یا استفاده از std::mutex / std::atomic بهره ببرید؛ میتوانید زمان اجرا را با اندازهگیری کنید تا ایدهای از بهبودهای موازیسازی در زمینههای HPC یا سیستمهای نزدیک به زمان واقعی به دست آورید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
برای جلوگیری از رقابت بر روی مقدار مشترک، هر ترد مجموع جزئی را در یک خانه جدا بنویسد و سپس در ترد اصلی کل را جمع کند. استفاده از long long برای جمعها به منظور جلوگیری از overflow و تعیین اندازه بلوک مناسب به منظور توازن بار بسیار مهم است. به جای mutex گاهبهگاه، نگهداری نتایج جداگانه برای هر ترد و در نهایت جمعبندی آنها میتواند کارایی را افزایش دهد. برای ارزیابی دقیق، اندازهگیری زمان با std::chrono را فراموش نکنید تا تفاوت بین اجرای سریالی و موازی روشن شود.
گزارش