یک برنامهٔ C++ بنویسید که با استفاده از هدر یک بردار بزرگ از اعداد صحیح را به چند ترد تقسیم کند و جمع هر بخش را محاسبه کرده و در پایان مجموع کل را چاپ کند.

0.0 بازدید آخرین ویرایش در 221 روز قبل ساعت 01:22

0.0

برای حل، یک تابع worker تعریف کنید که بازه‌ای از ایندکس‌های بردار را گرفته و جمع جزئی را محاسبه و در یک المان از بردار نتایج بنویسد؛ سپس برای هر بخش یک std::thread بسازید و بعد از اجرای همه تردها آنها را join کنید و مجموع نتایج جزئی را جمع کنید. از هدر برای ایجاد تردها استفاده کنید و می‌توانید با std::thread::hardware_concurrency تعداد ترد مناسب را تعیین کنید؛ برای جلوگیری از data race بهتر است هر ترد روی خانهٔ جداگانه‌ای از بردار نتایج بنویسد یا در صورت نیاز از std::mutex/std::atomic استفاده کنید و برای سنجش زمان اجرا را به کار ببرید — این تمرین برای آشنایی با مفاهیم پایهٔ همزمانی و تقسیم کار در سیستم‌های real-time و کاربردهای HPC مناسب است.

توسط پژوهشگر در 221 روز قبل ساعت 01:22
دسته بندی ها: C Plus Plus C Plus Plus for beginner
arash در 221 روز قبل ساعت 13:30

ایدهٔ خوبی است که با تقسیم ایندکس‌ها بین تردها، هر ترد بخشی از مجموع را محاسبه کند و نتیجه را در یک خانهٔ جداگانه بنویسد تا از رقابت داده‌ای جلوگیری شود. بهتر است با std::thread::hardware_concurrency تعداد تردهای مناسب را تعیین کنیم تا از oversubscription جلوگیری شود. برای جلوگیری از رقابت روی حافظه، هر ترد باید به یک خانهٔ مخصوص نتیجه در بردار نتایج بنویسد یا از mutex/atomic استفاده شود. در نهایت با join کردن همهٔ تردها، نتایج جزئی را جمع می‌کنیم تا کل جمع به دست آید؛ می‌توان زمان اجرا را با std::chrono اندازه‌گیری کرد.

گزارش

1 پاسخ

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

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