Порахуйте частоту літер у текстах за допомогою паралельних обчислень.
Паралелізм полягає в тому, щоб виконувати паралельно те, що також можна виконати послідовно. Поширений приклад - підрахунок частоти літер. Застосуйте паралелізм, щоб обчислити загальну частоту кожної літери в масиві текстів.
Існує кілька способів досягти паралелізму в 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
Clang libc++ починаючи з версії 17 має експериментальну часткову підтримку паралельних алгоритмів.
Щоб її увімкнути, потрібно вказати прапорець компілятора -fexperimental-library.
Apple Clang 15 і раніші версії не підтримують паралельних алгоритмів.
На Linux і macOS радимо для цієї вправи використовувати GCC (разом із типовим libstdc++).
MSVC від Microsoft підтримує паралельні алгоритми щонайменше від VS 2017 15.7, без потреби встановлювати додаткові бібліотеки.
Зареєструйтеся на Exercism, щоб вивчати й опановувати C++, а також 19 концепцій100 вправ та справжнє наставництво від людей, і все це безкоштовно.
Ми дослідимо різницю між конкурентністю і паралелізмом, розглянувши різні підходи, які застосовують такі мови, як JavaScript, Go, Elixir і Rust.