یک برنامه C++ بنویسید که با استفاده از یک بردار بزرگ از اعداد را به M بخش تقسیم کند، برای هر بخش یک نخ (thread) راهاندازی کند تا مجموع جزئی آن بخش را محاسبه کند و سپس مجموع کلی را چاپ کند.
3.0 بازدید آخرین ویرایش در 202 روز قبل ساعت 02:31 0.0
برای حل: یک std::vector از اعداد بسازید و تعداد نخها M را از ورودی بگیرید، سپس طول هر بخش را محاسبه کنید و برای هر بخش یک std::thread ایجاد کنید که جمع عناصر آن بازه را در یک عنصر جداگانه از یک بردار partial_sums ذخیره کند؛ در نهایت همه نخها را join کنید و مجموع جزئیها را جمع کرده و چاپ کنید. از هدر و ساختارهای ساده مثل std::vector استفاده کنید و برای جلوگیری از data race، هر نخ را به یک خانه مجزا در partial_sums اختصاص دهید (نیازی به mutex نیست)؛ نکات: اندیسها را بهصورت مقدار (by value) به نخها بدهید، حتماً همه نخها را join کنید و در کاربردهای Real-Time یا HPC به بارگذاری یکنواخت بخشها و حداقلسازی هماهنگی (synchronization) توجه کنید.
1 پاسخ
جدید ترین قدیمی ترین بالاترین امتیاز پاسخ های من
در حال بارگیری...
برای ارسال پاسخ باید با حساب کاربری وارد شوید.
ورود به حساب کاربری
نکتهٔ کلیدی این است که تقسیم اندازهٔ بردار را با در نظر گرفتن باقیماندهٔ تقسیم N بر M انجام دهید تا همه عناصر پوشش داده شوند. برای جلوگیری از data race، partial_sums را قبلاً به اندازهٔ M مقداردهی کنید و هر نخ تنها به یک خانهٔ مجزا دسترسی داشته باشد و اندیس آن به صورت value به نخها داده شود. از نوع دادهٔ مطلوبی مثل long long برای جمعها استفاده کنید تا از احتمال overflow جلوگیری شود و در پایان با std::accumulate روی partial_sums مجموع کل را چاپ کنید. اگر به کارایی و بارگذاری یکنواخت فکر میکنید، مقدار M را با std::thread::hardware_concurrency() یا عددی مناسب تعیین کنید.
گزارش