Conta a frequência das letras em textos recorrendo a computação paralela.
O paralelismo consiste em fazer em paralelo coisas que também podem ser feitas sequencialmente. Um exemplo comum é contar a frequência de letras. Usa o paralelismo para calcular a frequência total de cada letra numa lista de textos.
Há várias formas de alcançar paralelismo em C++. O executor online do Exercism suporta C++17, por isso podes usar políticas de execução da biblioteca de algoritmos. Outra opção é gerires as threads manualmente. No entanto, tem em conta que criar uma thread é bastante dispendioso (usar um thread pool ajudaria).
Quando trabalhas localmente, podes, claro, usar o que quiseres. No entanto, é muito provável que uma solução que use bibliotecas não padrão não funcione com o executor online do Exercism.
Quando trabalhas localmente, podes, se quiseres, correr um benchmark para teres uma ideia do ganho de velocidade das diferentes implementações.
Ativar a flag do CMake EXERCISM_INCLUDE_BENCHMARK ativa o benchmark:
cmake -DEXERCISM_RUN_ALL_TESTS=1 -DEXERCISM_INCLUDE_BENCHMARK=1 .
A implementação da biblioteca padrão do C++ (libstdc++) do GCC depende da TBB.
Se a TBB não estiver disponível, será usada uma versão sequencial como alternativa, mesmo quando for pedida execução paralela.
No Ubuntu, tens de instalar o pacote libtbb-dev:
apt-get install libtbb-dev
No macOS, podes usar o Homebrew para instalar a TBB:
brew install tbb
O libc++ do Clang, a partir da versão 17, tem suporte experimental e parcial para algoritmos paralelos.
Para o ativar, é preciso passar a flag de compilador -fexperimental-library.
O Apple Clang 15 e anteriores não suportam algoritmos paralelos.
No Linux e no macOS, recomendamos usar o GCC (juntamente com o libstdc++ padrão) para este exercício.
O MSVC da Microsoft suporta algoritmos paralelos pelo menos desde o VS 2017 15.7, sem ser preciso instalar nenhuma biblioteca adicional.
Inscreve-te no Exercism para aprenderes e dominares C++ com 19 conceitos100 exercícios, e mentoria humana real, tudo grátis.
Exploramos as diferenças entre concorrência e paralelismo, analisando as diferentes abordagens adotadas por linguagens como JavaScript, Go, Elixir e Rust.