병렬 연산을 사용해 텍스트에서 문자의 빈도를 세어요.
병렬성이란 순차적으로도 할 수 있는 일을 병렬로 처리하는 것을 말해요. 흔한 예시가 바로 문자의 빈도를 세는 거예요. 병렬성을 활용해 여러 텍스트로 이루어진 목록에서 각 문자의 전체 빈도를 계산해요.
C++에서 병렬성을 얻는 방법은 여러 가지가 있어요. Exercism의 온라인 러너는 C++17을 지원하므로, 알고리즘 라이브러리의 실행 정책을 사용할 수 있어요. 또 다른 방법은 스레드를 직접 관리하는 거예요. 다만 스레드를 새로 만드는 비용은 꽤 비싸다는 점을 기억해요(스레드 풀을 사용하면 도움이 돼요).
로컬에서 작업할 때는 물론 원하는 무엇이든 사용할 수 있어요. 하지만 비표준 라이브러리를 사용하는 풀이는 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부터 별도의 라이브러리를 설치하지 않고도 병렬 알고리즘을 지원해요.
Exercism에 가입하고 C++ 트랙을 개념 19개연습 문제 100개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.
동시성과 병렬성의 차이를 살펴보고, JavaScript, Go, Elixir, Rust 같은 언어들이 택한 여러 접근법을 함께 봐요.