یک برنامه 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) توجه کنید.

توسط پژوهشگر در 202 روز قبل ساعت 02:31
دسته بندی ها: C Plus Plus C Plus Plus for beginner
reyhaneh در 202 روز قبل ساعت 09:23

نکتهٔ کلیدی این است که تقسیم اندازهٔ بردار را با در نظر گرفتن باقیماندهٔ تقسیم N بر M انجام دهید تا همه عناصر پوشش داده شوند. برای جلوگیری از data race، partial_sums را قبلاً به اندازهٔ M مقداردهی کنید و هر نخ تنها به یک خانهٔ مجزا دسترسی داشته باشد و اندیس آن به صورت value به نخ‌ها داده شود. از نوع دادهٔ مطلوبی مثل long long برای جمع‌ها استفاده کنید تا از احتمال overflow جلوگیری شود و در پایان با std::accumulate روی partial_sums مجموع کل را چاپ کنید. اگر به کارایی و بارگذاری یکنواخت فکر می‌کنید، مقدار M را با std::thread::hardware_concurrency() یا عددی مناسب تعیین کنید.

گزارش

1 پاسخ

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

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