並列計算を使って、テキストに含まれる文字の出現頻度を数えましょう。
並列処理とは、順番に実行することもできる物事を、並行して行うことです。よくある例が、文字の出現頻度を数えることです。並列処理を活用して、テキストの配列に含まれる各文字の出現頻度の合計を計算しましょう。
C++で並列処理を実現するには、いくつかの方法があります。 ExercismのオンラインランナーはC++17に対応しているため、アルゴリズムライブラリの実行ポリシーを利用できます。 もう1つの方法は、スレッドを手動で管理することです。 ただし、スレッドの生成にはかなりコストがかかる点に注意してください(スレッドプールを使うと助けになります)。
ローカルで作業するときは、もちろん好きなものを使えます。 ただし、非標準のライブラリを使った解答は、おそらくExercismのオンラインランナーでは動きません。
ローカルで作業するときは、さまざまな実装でどれだけ速くなるかを知るために、任意でベンチマークを実行できます。
CMakeのフラグEXERCISM_INCLUDE_BENCHMARKを有効にすると、ベンチマークが有効になります:
cmake -DEXERCISM_RUN_ALL_TESTS=1 -DEXERCISM_INCLUDE_BENCHMARK=1 .
GCCによるC++標準ライブラリ(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++と合わせて)を使うことをおすすめします。
MicrosoftのMSVCは、少なくともVS 2017 15.7以降、追加のライブラリをインストールすることなく並列アルゴリズムをサポートしています。