فراوانی حروف را در متنها با استفاده از محاسبات موازی بشمارید.
موازیسازی یعنی کارهایی را بهصورت موازی انجام دهیم که میتوان آنها را بهصورت متوالی هم انجام داد. یک مثال رایج، شمردن فراوانی حروف است.
برای محاسبهی فراوانی کل هر حرف در فهرستی از متنها، از موازیسازی استفاده کنید.
راههای مختلفی برای رسیدن به موازیسازی در C++ وجود دارد. اجراکنندهی آنلاین Exercism از C++17 پشتیبانی میکند، بنابراین میتوانید از سیاستهای اجرا در کتابخانهی الگوریتمها استفاده کنید. گزینهی دیگر، مدیریت دستی ریسهها است. با این حال، توجه داشته باشید که ساختن یک ریسه نسبتاً پرهزینه است (استفاده از یک استخر ریسه کمک میکند).
وقتی بهصورت محلی کار میکنید، طبیعتاً میتوانید هر چه میخواهید به کار ببرید. با این حال، راهحلی که از کتابخانههای غیراستاندارد استفاده کند، به احتمال زیاد با اجراکنندهی آنلاین Exercism کار نخواهد کرد.
وقتی بهصورت محلی کار میکنید، میتوانید بهصورت اختیاری یک بنچمارک اجرا کنید تا تصوری از میزان افزایش سرعت پیادهسازیهای مختلف به دست آورید.
فعال کردن گزینهی CMake با نام EXERCISM_INCLUDE_BENCHMARK بنچمارک را فعال میکند:
cmake -DEXERCISM_RUN_ALL_TESTS=1 -DEXERCISM_INCLUDE_BENCHMARK=1 .
پیادهسازی کتابخانهی استاندارد C++ در GCC (یعنی libstdc++) به TBB وابسته است.
اگر TBB در دسترس نباشد، حتی وقتی اجرای موازی درخواست شده باشد، به یک نسخهی ترتیبی بازگشت داده میشود.
در Ubuntu باید بستهی libtbb-dev را نصب کنید:
apt-get install libtbb-dev
در macOS میتوانید با Homebrew، TBB را نصب کنید:
brew install tbb
libc++ در Clang از نسخهی ۱۷ به بعد پشتیبانی آزمایشی و نسبی از الگوریتمهای موازی دارد.
برای فعال کردن آن، باید گزینهی کامپایلر -fexperimental-library را بدهید.
Apple Clang ۱۵ و نسخههای پیشتر از آن، از الگوریتمهای موازی پشتیبانی نمیکنند.
در Linux و macOS توصیه میکنیم برای این تمرین از GCC (همراه با libstdc++ پیشفرض) استفاده کنید.
MSVC مایکروسافت، دستکم از VS ۲۰۱۷ ۱۵.۷ به بعد، بدون نیاز به نصب کتابخانهی اضافی از الگوریتمهای موازی پشتیبانی میکند.
در Exercism ثبتنام کنید تا C++ را همراه با 19 مفهوم100 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.
ما تفاوتهای میان همروندی و موازیسازی را بررسی میکنیم و به رویکردهای متفاوتی که زبانهایی مانند JavaScript، Go، Elixir و Rust در پیش میگیرند نگاه میکنیم.