๋์ปค ๋น๋๋ถํฐ ๋ ๋จน์ฌ์ฃผ๋ ๊ฐ์
- ๋ฏธ๋์ ๋๋ฅผ ์ํด
- ๊น๋จน๋๋ค.
C++17 execution ์ด๋?
- C++์ ํ์ค์๊ณ ๋ฆฌ์ฆ์ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ณ๋ ฌ์ฒ๋ฆฌ policy (seq, unseq, par, par_unseq ์ค ํ๋) ์ง์ ํด์ฃผ๋ฉด, ์ปดํ์ผ๋ฌ๊ฐ ์์์ ๋ฉํฐ์ฝ์ด๋ฅผ ํ์ฉํ๋ ์คํํ์ผ์ ์์ฑํด์ฃผ๋ ๋ฌธ๋ฒ์ ์๋ฏธํ๋ค.
- ์์ธํ ์ค๋ช ์ ์น์ ๋ง์ผ๋ ์๋ตํ๋ค.
- ๋์ ์ง์ ์คํํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ๋์ง์ ๋ํ
์ฐ๋งํด๊ฐ๊ธฐ๋ก.
์ค์ต
- ๋
๋ค ์ค์ตํด๋ณด์.
- ๋ชจ๋ ํ์ผ๋ค์ ์ฌ๊ธฐ์: C++17 execution policy practice with oneTBB
- ์ฐจ๋ก๋๋ก ์์๋ณด์.
1. ๋ชจ๋ ์ค์ต์ ์์์ ๋์ปค์ด๋ฏธ์ง ๊ตฝ๊ธฐ ๋ถํฐ
- ํ์ ํ๊ฒ ์ง๋ง gcc version ์ ๋ฐ๋ผ ๋น๋๊ฐ ๋๊ธฐ๋ ์๋๊ธฐ๋ ํ๋ค.
- ๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ์ค์ต์ ๊ธฐ๋ณธ์ ํ๊ฒฝ ๊ฒฉ๋ฆฌ๋ฅผ ์ ํธํ๋๋ก ํ์.
- ๋์ปค๋ฅผ ํ์ฉํ์.
- ๋์ปค์ ๋ํ ์์ธํ ์ค๋ช ์ ์๋ตํ๋ค.
Dockerfile.22.04
์ด๋ ์ด๋ฆ์ ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฅํ์.- ps. ํ์ฅ์๋ ์์ด๋ ๋๊ณ ์์ด๋ ๋๋ค. Dockerfile ์ด๋ผ๊ณ ๋ฌดํ์ฅ์๋ก ์ด๋ฆ์ง๋ ๊ฒ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ท์น์ด์ง๋ง ๋ง๋๋ก ์ง์ด๋ ์๊ด์๋ค.
FROM ubuntu:22.04 # ํ์ ํจํค์ง ์ค์น RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y \ build-essential \ g++ \ cmake \ git # ์์ ๋๋ ํ ๋ฆฌ ์ค์ WORKDIR /usr/src/myapp
- ์ถํ์ ๋ช ๊ฐ์ง ํ์ํ ๊ฒ์ ๋ ์ค์นํ ์์ ์ด๋ค.
- ๊ทธ๊ฒ๋ค์ ์๋ Dockerfile ์์ ๋ชจ๋ ๊ธฐ์ ํ์ฌ ์์ท์ผ๋ก ๋ ํธํ๊ฒ ํ๋ฉด ์ข๊ฒ ์ง๋ง
- ์คํ ๋ฐ์ด์คํ ์ผ๋ก ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ผ๋จ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ๋ง ๊ตฌ์ ๋ค.
- ์ด ์ ๋ ๋ฒ ์ด์ค๋ก๋ง ๊ตฌ์ฐ๋ฉด ๋นจ๋ฆฌ ๊ตฌ์์ง๊ณ ์ฉ๋๋ ์์์ ์ข๋ค. ์ด๋ฒ ์คํ์ธ์ ํ์์๋ ๋ค์ํ ์คํ๋ค์ ๊นจ๋ํ๊ฒ ์์ํด๋ณด๊ณ ์ถ์ ๋ ๊ณตํต์ ์ธ ๋ฏธ๋๋ฉํ ๋ฒ ์ด์ค๋ก ์ฐ๊ธฐ ์ข ๋ค.
- ์ถํ์ ๋ช ๊ฐ์ง ํ์ํ ๊ฒ์ ๋ ์ค์นํ ์์ ์ด๋ค.
- ๊ทธ๋์ ๋ C++ project ๋ฅผ ์ํํ ๋์๋ ์์ ์ C++ ์ํ๊ณ์ ๋ํด์๋ ์ ์์์ผ ํ๋ค (== C++๋ณด๋ค ์ข์ ์ธ์ด๊ฐ ๋์๋ค๊ณ ํด์ ๊ฑฐ๊ธฐ๋ก ๋ฐ๋ก ๊ฐ ์ ์๋ ์ด์ ).
- ํนํ ํ
์คํธ๋ฅผ ๋ฐ์ด๋๋ฆฌ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฑด ์ปดํ์ผ๋ฌ(์ ๋ง์ปค) ์ธ g++ ์ด๊ธฐ ๋๋ฌธ์, g++ ๋ฒ์ ์ด ๋ช์ธ์ง ์ต๊ด์ ์ผ๋ก ์ฒดํฌํ๋๋ก ํ์.
- ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ๋ฒ์ ๋ค์ ๋ํดํธ ์กฐํฉ๋ค์ด ์กด์ฌํ๋ค.
- ์๋ฅผ ๋ค์ด ์์์์ฒ๋ผ ๊ฐ๋จํ g++ ๋ผ๊ณ ํ๋ฉด OS ๋ฒ์ ์ ๋ฐ๋ผ์ ๋ํดํธ ๋ฒ์ ์ ์ก๋ ๊ฒ์ด ๋ค๋ฅด๋ค.
FROM ubuntu:22.04
ํ ๊ฒฝ์ฐ (g++ -v
ํด๋ณด๋ฉด) ๊ธฐ๋ณธ์ ์ผ๋ก 11.4๋ฅผ ์ค์นํ๋ค.FROM ubuntu:20.04
ํ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก 9.4๋ฅผ ์ค์นํ๋ค.
- ์๋ฅผ ๋ค์ด ์์์์ฒ๋ผ ๊ฐ๋จํ g++ ๋ผ๊ณ ํ๋ฉด OS ๋ฒ์ ์ ๋ฐ๋ผ์ ๋ํดํธ ๋ฒ์ ์ ์ก๋ ๊ฒ์ด ๋ค๋ฅด๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ด ๋ชจ๋ ๋ฒ์ ๋ค์ ๋ํดํธ ์กฐํฉ๋ค์ด ์กด์ฌํ๋ค.
- ํนํ ํ
์คํธ๋ฅผ ๋ฐ์ด๋๋ฆฌ๋ก ๋ฐ๊ฟ์ฃผ๋ ๊ฑด ์ปดํ์ผ๋ฌ(์ ๋ง์ปค) ์ธ g++ ์ด๊ธฐ ๋๋ฌธ์, g++ ๋ฒ์ ์ด ๋ช์ธ์ง ์ต๊ด์ ์ผ๋ก ์ฒดํฌํ๋๋ก ํ์.
- ps. ํ์ฅ์๋ ์์ด๋ ๋๊ณ ์์ด๋ ๋๋ค. Dockerfile ์ด๋ผ๊ณ ๋ฌดํ์ฅ์๋ก ์ด๋ฆ์ง๋ ๊ฒ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ท์น์ด์ง๋ง ๋ง๋๋ก ์ง์ด๋ ์๊ด์๋ค.
- ํฐ๋ฏธ๋์์ ์ด๋ ๊ฒ ํ๋ฉด ์ด๋ฏธ์ง๊ฐ ๊ตฌ์์ง๋ค.
$ docker buildx build -f ./Dockerfile.22.04 -t cpp-experiment:22.04 .
- ๋ง์ง๋ง์
.
์ Dockerfile.22.04 ์ด๋๊ฒ ํ์ฌ ๋๋ ํ ๋ฆฌ์ ์์์ ์๋ฏธํ๋ค.
- ๋ง์ง๋ง์
$ docker images
๋ผ๊ณ ํ๋ฉด ๊ตฌ์์ง ์ด๋ฏธ์ง๋ฅผ ๋ณผ ์ ์๋ค.- ์์
REPOSITORY TAG IMAGE ID CREATED SIZE cpp-experiment 22.04 f5621b4b7d84 10 hours ago 1.24GB
- ์์
2. ๋์ปค ์ปจํ ์ด๋ ๋์ฐ๊ธฐ
docker run
์ด์ฉ๊ตฌ ํ๋ฉด ๋์ปค ์ด๋ฏธ์ง๋ก๋ถํฐ ์ปจํ ์ด๋๋ฅผ ์ธ์คํด์คํ ํ ์ ์๋ค.- ๊ทผ๋ฐ ๋ค์ ๋ถ๋ argument๋ค์ ๋งค๋ฒ ์น๋ ๊ฒ ๊ท์ฐฎ๊ธฐ ๋๋ฌธ์ ์คํฌ๋ฆฝํธํ ํ์.
- ์๋ฅผ ๋ค์ด์,
run_tbb.22.04.sh
๋ผ๊ณ ํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ์จ์ค๋ค.echo Using 0 to $1 cores docker run -ti --rm \ --cpuset-cpus="0-$1" \ --name my-running-app-2204 \ -v $PWD:/usr/src/myapp \ cpp-experiment:22.04 \ bash
- ์ด๋ฒ ์คํ (ํ์ ) ์์ ์ฝ์ด ๊ฐ์์ ๋ฐ๋ฅธ ์ฑ๋ฅ์ฐจ์ด๋ฅผ ๋ณด๊ธฐ ์ํด ์ด๋ ๊ฒ ํธํ๊ฒ ๋ฐ๋๋ก ํ์๋ค. ํฐ๋ฏธ๋์์
$ ./run_tbb.22.04.sh 5
์ด๋ฐ์์ผ๋ก ๋๋ฒ์งธ ์ธ์๋ก ์ซ์๋ฅผ ์ค๋ค. 5๋ผ๊ณ ํ๋ฉด 0๋ฒ ์ฝ์ด๋ถํฐ 5๋ฒ์ฝ์ด๊น์ง ์ฌ์ฉํ๋ค๋ ๋ป์ด๋ค. - docker run ํ ๋
--cpuset-cpus
์ต์ ์ ์ฃผ๋ฉด ์ปจํ ์ด๋์ ํ ๋นํ ํธ์คํธ CPU๋ฅผ ๋ช ์์ ์ผ๋ก ์ง์ ํด์ค ์ ์๋ค. ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๊ฒฝ์ ๊ฒฉ๋ฆฌ๋ฟ ์๋๋ผ ์์์ ๊ฒฉ๋ฆฌ๋ฅผ ์ธํ ํด์ค ์๋ ์๋ค.
- ์ด๋ฒ ์คํ (ํ์ ) ์์ ์ฝ์ด ๊ฐ์์ ๋ฐ๋ฅธ ์ฑ๋ฅ์ฐจ์ด๋ฅผ ๋ณด๊ธฐ ์ํด ์ด๋ ๊ฒ ํธํ๊ฒ ๋ฐ๋๋ก ํ์๋ค. ํฐ๋ฏธ๋์์
- ๊ทธ๋์ ํ์ฌ ํด๋์ ์ด๋ฐ๊ฒ๋ค์ด ์์ ๋,
โฐโ$ pwd /home/gskim/Documents/cpp17execution/blog โฐโ$ ls Dockerfile.22.04 main.cpp run_tbb.22.04.sh
- ํฐ๋ฏธ๋์์ ์ด ์์น์์,
$ chmod +x run_tbb.22.04.sh
ํ ๋ค์์$ run_tbb.22.04.sh 3
์ด๋ ๊ฒ ํด์ฃผ๋ฉด CPU ์ฝ์ด ๊ฐ์๋ฅผ ์ ํํ์ฌ ๋์ปค ์ปจํ ์ด๋ ํฐ๋ฏธ๋ ์์ผ๋ก ๋ค์ด๊ฐ ์ ์๋ค.- ๋์ปค๋น๋ํ ๋
WORKDIR /usr/src/myapp
๋ผ๊ณ ์ง์ ํ๊ธฐ ๋๋ฌธ์, ๋์ปค ์ปจํ ์ด๋ ํฐ๋ฏธ๋๋ก ๋ค์ด๊ฐ๋ฉด ๋ฐ๋ก /usr/src/myapp ๋ผ๋ ์์น์ ์กด์ฌํ๊ฒ ๋๋ค. ๊ทธ๋์ ํธ์์,-v $PWD:/usr/src/myapp
๋ผ๊ณ ํด์, ์์ค์ฝ๋๊ฐ ์๋ ํ์ฌ ํธ์คํธ์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋์ปค์ด๋ฏธ์ง์ /usr/src/myapp ์ ๋ง์ดํธํด์ฃผ์๋ค.
- ๋์ปค๋น๋ํ ๋
- ์๋ฅผ ๋ค์ด์,
3. ๋น๋ ๋ฐ ์คํ: 1์ฐจ์๋
- ์ ๊ฒฝ๋ก์ ์๋ ์คํํ์ผ์ธ
main.cpp
๋ ๋ค์๊ณผ ๊ฐ๋ค.- ์ด ์ฝ๋๋ ๋ด๊ฐ ์ง ๊ฒ์ ์๋๊ณ cppreference์ ์๋ ๊ฒ์ ๊ฑฐ์ ๊ทธ๋๋ก ๊ฐ์ ธ์จ ๊ฒ์ด๋ค.
- ์ด์ : ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ค์ต์๋ ํญ์ ๋ณ์ธ์ด ํต์ ๋๋ฉด ์ข๊ธฐ ๋๋ฌธ์ด๋ค (์ฆ, ์ธํ ์ ๋ชจ๋ ์ ๋๋ก ํ์ง๋ง ๋ด๊ฐ ์ง์ ์ง ์ฝ๋์ ์กด์ฌํ๋ ๊ฒฐํจ์ผ๋ก ๋ณ๋ ฌ์คํ์คํ์ด ์ ๋๋ก ์๋ ์๋ ์์ผ๋ฏ๋ก).
#include <algorithm> #include <chrono> #include <cstdint> #include <iostream> #include <random> #include <string> #include <vector> #ifdef PARALLEL // clang-format off #include <execution> // clang-format on namespace execution = std::execution; #else enum class execution { seq, unseq, par_unseq, par }; #endif void measure([[maybe_unused]] auto policy, const std::string policy_name, std::vector<std::uint64_t> v) { const auto start = std::chrono::steady_clock::now(); #ifdef PARALLEL std::sort(policy, v.begin(), v.end()); #else std::sort(v.begin(), v.end()); #endif const auto finish = std::chrono::steady_clock::now(); auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(finish - start); std::cout << policy_name << ": " << duration.count() << " milliseconds" << std::endl; }; int main() { std::vector<std::uint64_t> v(1'000'000); std::mt19937 gen{std::random_device{}()}; std::ranges::generate(v, gen); #ifdef PARALLEL measure(execution::seq, "seq ", v); measure(execution::unseq, "unseq ", v); measure(execution::par_unseq, "par_unseq", v); measure(execution::par, "par ", v); #else measure(execution::seq, "No execution policy", v); #endif return 0; }
- ์ด ์ฝ๋๋ ๋ด๊ฐ ์ง ๊ฒ์ ์๋๊ณ cppreference์ ์๋ ๊ฒ์ ๊ฑฐ์ ๊ทธ๋๋ก ๊ฐ์ ธ์จ ๊ฒ์ด๋ค.
- ์ผ๋จ ๋ชจ๋ ์ฝ์ด๋ฅผ ๋ค ์ฌ์ฉํ์ ๋ ์ผ๋ง๋ ์ฑ๋ฅ์ด๋์ด ์๋์ง ํ์ธํ์
- core 20๊ฐ ์ง๋ฆฌ์ธ i7-13700H ์์ ํ ์คํธ ํ์๋ค.
- 19 ๋ผ๊ณ ํด์ 0๋ฒ๋ถํฐ 19๋ฒ ์ฝ์ด๊น์ง ๋ค ํ ๋นํด๋ณด์.
$ run_tbb.22.04.sh 19
- 1์ฐจ์๋-1 (no par)
- ์ผ๋จ ์๋1์์๋ ์๋์ ์ผ๋ก ๋น๋ํ ๋
-DPARALLEL
option ์ ์ธ์๋ก ์ฃผ์ง ์์ ๋ณธ๋ค (์ ์ฝ๋์ #ifdef ๋ธ๋ก ์ฐธ๊ณ ).- ๋๋ฌธ์ ์๋ง ์ฑ๋ฅ ์ด๋์ด ์์ ๊ฒ์ด๋ค.
- 1์ฐจ์๋ 1a: no par no opt
- ๋ฐฉ๊ธ 19๊ฐ ์ฝ์ด๋ฅผ ํ ๋นํ์ฌ ๋ค์ด์จ ๋์ปค ์ปจํ
์ด๋ ์ ํฐ๋ฏธ๋์์ ์ด๋ ๊ฒ ์
๋ ฅํด์ ๋น๋ํด์ฃผ์.
$ g++ -std=c++20 main.cpp -o main
- ps: cpp20๋ถํฐ ๋์
๋ โThe big fourโ ์ค ํ๋์ธ
range
๋ฅผ ํ์ฉํ๊ณ ์์ด์ c++20 ์ผ๋ก ๋น๋ํด์ฃผ์๋ค.
- ps: cpp20๋ถํฐ ๋์
๋ โThe big fourโ ์ค ํ๋์ธ
$ ./main
ํด์ ์คํ (3๋ฒ) ํด์ฃผ๋ฉด ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.root@82b404f8eac1:/usr/src/myapp# ./main No execution policy: 479 milliseconds root@82b404f8eac1:/usr/src/myapp# ./main No execution policy: 460 milliseconds root@82b404f8eac1:/usr/src/myapp# ./main No execution policy: 529 milliseconds
- ๊ทธ๋ฐ๋ฐ ๋ง์ดํฌ๋ก๋ฒค์น๋งํฌ ํ ๋ -O3 ๋ฅผ ๋ฃ์ง ์๊ณ ํ๋ ๊ฒ์ ์๋ฏธ์๋ค.
- ๋ฐฉ๊ธ 19๊ฐ ์ฝ์ด๋ฅผ ํ ๋นํ์ฌ ๋ค์ด์จ ๋์ปค ์ปจํ
์ด๋ ์ ํฐ๋ฏธ๋์์ ์ด๋ ๊ฒ ์
๋ ฅํด์ ๋น๋ํด์ฃผ์.
- 1์ฐจ์๋ 1b: no par (O3 opt as default)
- ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ๋น๋ํด์ ์คํํด๋ณด์.
$ g++ -std=c++20 -O3 main.cpp -o main
$ ./main
ํด์ ์คํ (3๋ฒ) ํด์ฃผ๋ฉด ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์๋ค.root@82b404f8eac1:/usr/src/myapp# ./main No execution policy: 170 milliseconds root@82b404f8eac1:/usr/src/myapp# ./main No execution policy: 156 milliseconds root@82b404f8eac1:/usr/src/myapp# ./main No execution policy: 144 milliseconds
- ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ๋น๋ํด์ ์คํํด๋ณด์.
- ์ด๋ก๋ถํฐ ์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ์ฌ์ค์ ์ ์ ์๋ค.
- ์ผ๋จ ๋น์ฐํ ์ปดํ์ผ๋ฌ์ต์ ํ (O3) ๋ ๊ฑธ์ด์ฃผ์ด์ผ ํ๋ค.
- ๋ณ๋ ฌ์ฒ๋ฆฌ ํ์ง ์์ผ๋ฉด ์ ์ ๋ ๋์จ๋ค. (๋ฒ ์ด์ค๋ผ์ธ ํ๋ณด)
- ๋ฌผ๋ก n ๋ง๋ค, ๋จธ์ ๋ง๋ค ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํญ์ ์๊ธฐ ๋จธ์ ์์ ์ธก์ ํ ๊ฒฐ๊ณผ๋ก๋ง ๋งํด์ผ ํ๋ค.
- ์ผ๋จ ์๋1์์๋ ์๋์ ์ผ๋ก ๋น๋ํ ๋
- 1์ฐจ์๋-2 (par)
- ์ด์ ๋ฒ ์ด์ค๋ผ์ธ ์คํ๊ฒฐ๊ณผ๊ฐ ํ๋ณด๋์๊ธฐ ๋๋ฌธ์ ๋ณ๋ ฌ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ณด์.
- ps. O3 ๋ ํญ์ ๊ฑธ์ด์ค๋ค.
-DPARALLEL
์ธ์๋ฅผ ๋ฃ์ด์ ๋น๋ํ๋ค.$ g++ -std=c++20 -O3 main.cpp -DPARALLEL -o main
- ๋ง์ฐฌ๊ฐ์ง๋ก 3๋ฒ ์ ๋ ์คํํด๋ณด๋ฉด
root@82b404f8eac1:/usr/src/myapp# ./main seq : 135 milliseconds unseq : 142 milliseconds par_unseq: 164 milliseconds par : 148 milliseconds root@82b404f8eac1:/usr/src/myapp# ./main seq : 153 milliseconds unseq : 151 milliseconds par_unseq: 131 milliseconds par : 129 milliseconds root@82b404f8eac1:/usr/src/myapp# ./main seq : 146 milliseconds unseq : 136 milliseconds par_unseq: 132 milliseconds par : 144 milliseconds
- โโโ
- ์ ํ ๋ณ๋ ฌ์ฒ๋ฆฌ๊ฐ ์๋๊ณ ์์์ ์ ์ ์๋ค.
- ์์ ์๋ ์ฝ๋์์์๋ cppreference ์ ๋จ์๊ฐ ์์ ์ง ๋ค์ ๊ฐ๋ณด์.
- ์ํ
-ltbb
์ ๊ฐ์ด tbb ๋ฅผ ๋งํฌํด์ฃผ์ด์ผ ํ๋ค.- gcc๋ (์ ์์ ์์๋ gcc13์ ์ฌ์ฉํ๊ณ ์์) c++17 execution policy์ text code๋ฅผ binary๋ก ๋ณํํ๊ธฐ ์ํด ๋ด๋ถ์ ์ผ๋ก๋ tbb๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๋ฏํ๋ค.
-ltbb
๋ผ๊ณ ๋ฃ์ด์ ๋น๋๋ฅผ ์๋ํ๋ฉด, ์ฆ:$ g++ -std=c++20 -O3 main.cpp -DPARALLEL -ltbb -o main
- ์ด๋ ๊ฒ ๋ชป์ฐพ๊ฒ ๋ค๊ณ ๋งํฌ ์๋ฌ๊ฐ ๋ฌ๋ค.
/usr/bin/ld: cannot find -ltbb: No such file or directory collect2: error: ld returned 1 exit status
- ์ด์ ๋ฒ ์ด์ค๋ผ์ธ ์คํ๊ฒฐ๊ณผ๊ฐ ํ๋ณด๋์๊ธฐ ๋๋ฌธ์ ๋ณ๋ ฌ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ป์ด๋ณด์.
4. 2์ฐจ์๋: TBB ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
- tbb ๋ฅผ ๋ฐ๋ก ์ค์น๋ฅผ ํด์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
- ๋ฐฉ๋ฒ 1: apt-get ์ด์ฉ
$ apt-get install libtbb-dev
- ์ด๋ ๊ฒ ํ๋ฉด ์ด ๊ธ ์์ฑ ๊ธฐ์ค, ๋ฒ์ ์
- 20.04 ์์๋ libtbb-dev is already the newest version (2020.1-2) ๊ฐ
- 22.04 ์์๋ libtbb-dev is already the newest version (2021.5.0-7ubuntu2) ๊ฐ ๊ธฐ๋ณธ์ผ๋ก ์ค์น๋๋ค.
- ํ์ธ ๋ฐฉ๋ฒ
- ์์ apt-get install ์ค์น ํ ํด๋น ๋ช ๋ น์ด๋ฅผ ํ๋ฒ ๋ ์ ๋ ฅํ๋ฉด ์์ ๊ฐ์ด ์ถ๋ ฅ์ด ๋์ค๊ณ ,
- ํน์ ์ฝ๋ ์์์
/* #include <tbb/tbb.h> */ std::cout << "TBB Version: " << TBB_VERSION_MAJOR << "." << TBB_VERSION_MINOR << std::endl;
์ ๊ฐ์ด ํด์ฃผ์ด๋ ๋ฒ์ ์ ๋ณผ ์ ์๊ฒ ๋ค.
- ์ฒจ์ธ
- ๊ตณ์ด (์ด์ 2024๋ ์) Ubuntu 18.04 ์์ ํ๋ ๊ฒ์ ์ถ์ฒํ์ง๋ ์๋๋ค.
- ๊ทธ๋์ ๋ tbb release notes ๋ฅผ ๋ณด๋ฉด 2020๋
์ด ์ด๋ฆ์ด Threading Building Blocks ์์ oneTBB ๋ก ๋ณ๊ฒฝ๋์๋ค. ๊ทธ ์ฌ์ด ํธํ์ฑ ๋ฌธ์ ๋ ์์๊น?
- ์ํผ ๊ทธ ์ด์ ๋ ๊ณต์ ๋ฆฌ๋๋ฏธ์ ๋ฐ๋ฅด๋ฉด ์์ฝ์์คํ
์ ํธ์
๋จ ์ด์ฉ๊ตฌ
- ์ํผ ๊ทธ ์ด์ ๋ ๊ณต์ ๋ฆฌ๋๋ฏธ์ ๋ฐ๋ฅด๋ฉด ์์ฝ์์คํ
์ ํธ์
๋จ ์ด์ฉ๊ตฌ
- ์ด๋ ๊ฒ ํ๋ฉด ์ด ๊ธ ์์ฑ ๊ธฐ์ค, ๋ฒ์ ์
- ๋ฐฉ๋ฒ 2: ์ง์ ๋น๋
- ๊ณต์ ๊นํ๋ธ ๋ฆฌ๋๋ฏธ ๋ฅผ ์ฐธ๊ณ ํด์ ๋น๋ํด์ฃผ๋ฉด ๋๋ค.
- ์ง์ ๋น๋ํ ๋์ ์ฅ์ ์ ํน์ ๋ฒ์ ์ ์ฝ ์ง์ด์ ์ฌ์ฉํด์ค ์ ์๋ค๋ ๊ฒ์ด๋ค.
- ๋น๋ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น๊ณผ์ ์ ํ๋ํ๋ ๋ค ์ ์ด๋ณด์๋ฉด
- ์ผ๋จ
$ run_tbb.22.04.sh 19
ํด์ ๋์ปค ์ปจํ ์ด๋๋ก ๋ค์ด์จ๋ค.- 19๋ ๋์ถฉ ๋งฅ์ค ์ฝ์ด ์ซ์ (ํ์ฌ ์์์์๋ 20๊ฐ ์ฝ์ด CPU์ฌ์ฉ ์ค์ด๋ฏ๋ก). ๊ฐ์ ๋จธ์ ์ ๋ง๊ฒ ํ๋ฉด ๋๋ค. oneTBB library๋ฅผ ๋น๋ ํ ๋ ๋น ๋ฅด๊ฒ ๋น๋ํ๋ ค๋ฉด -j option์ ์ฃผ์ด์ผ ํ๋๋ฐ ์ด๋ฅผ ์ํด ์ฝ์ด๋ฅผ ๋ง์ด ๋ฌผ๊ณ ๋ค์ด๊ฐ์ผ ํ๋ค.
- ๊ทธ ๋ค์๋ถํฐ ์๋์ฒ๋ผ ํด์ฃผ์.
$ git clone https://github.com/oneapi-src/oneTBB $ cd oneTBB $ mkdir build $ cmake -DTBB_TEST=OFF .. // test๊น์ง ๋น๋ํ ํ์๋ ์๋ค. ์ด๊ฑธ ๋น๋ํ๊ณ ์์ผ๋ฉด ์๊ฐ์ด ๋งค์ฐ ์ค๋ ๊ฑธ๋ฆฐ๋ค. $ cmake --build . -j $ cmake --install .
- ์ผ๋จ
- ํ์ฌ ์ด ๊ธ์ ์์ฑํ๊ณ ์๋ ์์ ์์ git clone ํด์ master branch์ ์ต์ ์ ๋น๊ฒจ์๋๋ TBB Version: 2021.12 ๋ก ์ถ๋ ฅ๋์๋ค.
- ์ฐธ๊ณ ๋ก ์์ ubuntu22.04 ๋ฅผ ๋ฒ ์ด์ค์ด๋ฏธ์ง๋ก ํด์, ๋ํดํธ๋ก apt-get install ๋ก ์ค์น๋ ๊ฒ์ ๋ฒ์ ์ TBB Version: 2021.5 ์๋ค.
- ์ฌ์ฉํ๋ ์ ์ฅ์์ ๊ทธ ์ฐจ์ด๋ฅผ ๋๋ ๊ธฐ๋ฅ์ ์ฐ๊ณ ์์ง๋ ์์ง๋ง, ์ง์ ๋น๋ํด๋ณด๋ ์ค์ต์ ํด๋ณด์๋ค.
- ์ฒจ์ธ
- ubuntu20.04 ๋ฅผ ๋ฒ ์ด์ค์ด๋ฏธ์ง๋ก ํด์ master branch์ ์ต์ ์ ๋น๊ฒจ์์ (์ฆ, TBB Version: 2021.12) ์ง์ ์์ค์ฝ๋๋ฅผ ๋น๋ํ๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ ์๋ฌ๋ค์ด ๋ํ๋๋ค.
- ubuntu20.04 ์์ apt-get install g++ ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก version 9.4 ๊ฐ ์ค์น๋๋๋ฐ ์ด๊ฒ ์ต์ oneTBB ๋ฅผ ๋น๋ํ ์ ์๋ ๋ฏ ํ๋ค.
- g++ ๋ฒ์ ์ 11๋ก ๊ฐ์ ๋ก ์
๊ทธ๋ ์ด๋ ํด์ฃผ๊ณ ๋น๋๋ฅผ ์ํํ๋ ์ต์ TBB๋ฒ์ ์ ๋น๋ํ ์ ์์๋ค.
- ์ด๋ฐ ์กฐํฉ์ ๊ฒ์ํด๋ ์ ์๋์ค๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๋ฌธ์ ๊ฐ ์๋๋ผ๊ณ ์๋ชป ์์ฌํ๋๋ผ ์๊ฐ์ ๋ง์ด ๋ญ๋นํ ์ ์๋ค. ์ปดํ์ผ๋ฌ ๋ฒ์ ํธํ์ฑ๋ ๋ ์์ฌํด๋ณด์. ๊ทธ๋ฆฌ๊ณ ๋ช ๊ฐ ์กฐํฉ์ ์ง์ ์ํํด์ ๋๋ ์กฐํฉ์ ์คํ์ ์ผ๋ก ์ฐพ๊ณ ๊ธฐ๋กํ์.
- g++ ๋ฒ์ ์ 11๋ก ๊ฐ์ ๋ก ์
๊ทธ๋ ์ด๋ ํด์ฃผ๊ณ ๋น๋๋ฅผ ์ํํ๋ ์ต์ TBB๋ฒ์ ์ ๋น๋ํ ์ ์์๋ค.
- ubuntu20.04 ์์ apt-get install g++ ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก version 9.4 ๊ฐ ์ค์น๋๋๋ฐ ์ด๊ฒ ์ต์ oneTBB ๋ฅผ ๋น๋ํ ์ ์๋ ๋ฏ ํ๋ค.
- ubuntu20.04 ๋ฅผ ๋ฒ ์ด์ค์ด๋ฏธ์ง๋ก ํด์ master branch์ ์ต์ ์ ๋น๊ฒจ์์ (์ฆ, TBB Version: 2021.12) ์ง์ ์์ค์ฝ๋๋ฅผ ๋น๋ํ๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ ์๋ฌ๋ค์ด ๋ํ๋๋ค.
- ๊ณต์ ๊นํ๋ธ ๋ฆฌ๋๋ฏธ ๋ฅผ ์ฐธ๊ณ ํด์ ๋น๋ํด์ฃผ๋ฉด ๋๋ค.
- ์ค์นํ์ธ
- ์ด๋ ๊ฒ ํ๋ฉด tbb๊ฐ ์ด๋์ ์ด๋ป๊ฒ ์ค์น๋์๋์ง ํ์ธํด๋ณผ ์ ์๋ค.
$ find /usr/include /usr/local/include -name '*tbb*'
- tip. bat์ด๋ผ๊ณ cat๋ณด๋ค ์ข์ ํด์ด ์๋๋ฐ ์ด๊ฑฐ ์ค์น ํ
$ batcat [ํ์ผ๋ช ]
๊ณผ ๊ฐ์ด ์ ๋ ฅํ๋ฉด ํฐ๋ฏธ๋์์ ํ์ผ์ ๋ณผ ๋ ์ข ๋ ํธ์ํ๊ณ ์์๊ฒ ๋ณผ ์ ์๋ค.
- tip. bat์ด๋ผ๊ณ cat๋ณด๋ค ์ข์ ํด์ด ์๋๋ฐ ์ด๊ฑฐ ์ค์น ํ
- ์ด๋ ๊ฒ ํ๋ฉด tbb๊ฐ ์ด๋์ ์ด๋ป๊ฒ ์ค์น๋์๋์ง ํ์ธํด๋ณผ ์ ์๋ค.
5. Application ๋น๋
- ์์ ubuntu 22.04 ๊ธฐ์ค,
- g++ version 11.4 ๋ฅผ ์ด์ฉํด์,
- TBB (oneTBB) version 2021.5 ํน์ 2021.12 ๋ฅผ ๋ฌด์ฌํ ์ค์นํ์๋ค.
- ps. ์ด๋ ๊ฒ ์ค์นํ ๋ณ๊ฒฝ์ ๋ค์ ์ ๋ ๋ ค๋จน๊ธฐ ์ํด์๋
docker commit [์ปจํ ์ด๋์ด๋ฆ] [์ด๋ฏธ์ง์ด๋ฆ:ํ๊ทธ]
ํด์ฃผ์ด์ผ ์ ์ฅ์ด ๋๋ค.- ํน์ ์ด๋ฐ ์ค์น๊ณผ์ ๋ค์ ์์ Dockerfile ํ์ผ์ ๋ชจ๋ ํฉ์ณ๋๋ ๊ฒ ์ข๋ค.
- ps. ์ด๋ ๊ฒ ์ค์นํ ๋ณ๊ฒฝ์ ๋ค์ ์ ๋ ๋ ค๋จน๊ธฐ ์ํด์๋
- ์ด๊ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋ ๋ฐ ์ค์น ํ ๊ฒ์ด๊ณ ,
- ์ด์ ์ฐ๋ฆฌ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋น๋ ๋ฐ ์คํํด๋ณด์.
- ๋ฐฉ๋ฒ 1: ์คํฌ๋ฆฝํธ๋ก ๋น๋
- ์์ ์๊ธฐํ๋ฏ, ์ด๋ ๊ฒ ํ๋ฉด ํ์ค์ปท์ด๋ค.
- ๋์ปค ์ปจํ
์ด๋ ์์ผ๋ก ๋ค์ด์จ ๋ค์,
$ g++ -std=c++20 -O3 main.cpp -DPARALLEL -ltbb -o main
- ps. g++ version 9 ์์๋ c++20์ด๋ผ๊ณ ํ๋ฉด ๋ชป์์ ๋ฃ๊ณ c++2a ๋ผ๊ณ ํด์ผ ์์ ๋ฃ๋๋ค.
- ๋์ปค ์ปจํ
์ด๋ ์์ผ๋ก ๋ค์ด์จ ๋ค์,
- ๊ทธ๋ฌ๋ฉด ๋ฐ์ด๋๋ฆฌ๊ฐ ์์ฑ๋๊ณ
$ ./main
์ด๋ผ๊ณ ํ๋ฉด ์คํ๋๋ค.
- ์์ ์๊ธฐํ๋ฏ, ์ด๋ ๊ฒ ํ๋ฉด ํ์ค์ปท์ด๋ค.
- ๋ฐฉ๋ฒ 2: cmake ๊ธฐ๋ฐ ๋น๋
- ์ฌ์ค ํ์ผ ํ๋ ์ง๋ฆฌ ํ๋ก์ ํธ๊ฐ (๋น์ฐํ) ์๋ ๋์๋, ์ด๊ฒ ์ ์์ด๋ค.
- cmake ๊ฐ์ ๊ฒ (CMakeLists.txt ํ์ผ ์์ฑํ๋ ๊ฒ) ๋ฐ๋ก ์๊ฐ๋ด์ ๊ณต๋ถํ๊ธฐ ๋๊ฒ ๊ท์ฐฎ๊ณ ๊น๋ค๋ก์ด๋ฐ
- ChatGPT4 ์๋๊ฐ ์ค๋ฉด์ ํดํผํด์ก๋ค. โํด ์คโ ๋ผ๊ณ ํ๋ฉด ์ด๋ ๊ฒ ํด์ค๋ค.
- ๋ฌผ๋ก ์ฌ์ฉ์๊ฐ ๊ฒ์ฆ์ ํด์ผ๊ฒ ์ง๋ง, ๊ฒฝํ์ ์ผ๋ก ์ด๋ฐ work์ ๋์ฒด๋ก ์ ํ๋ค.
- ์ ๋ ๊ฒ CMakeLists.txt ํ์ผ์ ์์ฑํ ๋ค ํ๋๋๋ก ํ๋ฉด ๋๊ฒ ๋ค.
- ์ฆ, ๋์ปค ์ปจํ
์ด๋ ์์ผ๋ก ๋ค์ด์จ ๋ค์,
$ mkdir build $ cd build $ cmake .. $ make -j
- ์ฆ, ๋์ปค ์ปจํ
์ด๋ ์์ผ๋ก ๋ค์ด์จ ๋ค์,
- ๊ทธ๋ฌ๋ฉด ๋ฐ์ด๋๋ฆฌ๊ฐ ์์ฑ๋๊ณ
$ ./main
์ด๋ผ๊ณ ํ๋ฉด ์คํ๋๋ค.
6. ์คํ ๊ฒฐ๊ณผ
- ์ด์ ๋ณ๋ ฌ์ฒ๋ฆฌ๊ฐ ์ ๋๋ค. 5๋ฒ ์คํํด๋ณด๋ฉด ์ผ๊ด๋๊ฒ
par
์ฌ์ฉ ์ ๊ฐ์ ์ด ์์ (์ฝ์ด 20๊ฐ ์ฌ์ฉ) ์ ์ ์ ์๋ค.root@65461ff9d981:/usr/src/myapp/build# ./main seq : 147 milliseconds unseq : 145 milliseconds par_unseq: 24 milliseconds par : 24 milliseconds root@65461ff9d981:/usr/src/myapp/build# ./main seq : 138 milliseconds unseq : 131 milliseconds par_unseq: 20 milliseconds par : 21 milliseconds root@65461ff9d981:/usr/src/myapp/build# ./main seq : 146 milliseconds unseq : 136 milliseconds par_unseq: 22 milliseconds par : 21 milliseconds root@65461ff9d981:/usr/src/myapp/build# ./main seq : 132 milliseconds unseq : 132 milliseconds par_unseq: 20 milliseconds par : 21 milliseconds root@65461ff9d981:/usr/src/myapp/build# ./main seq : 129 milliseconds unseq : 129 milliseconds par_unseq: 22 milliseconds par : 25 milliseconds
7-1. Ablation 1: core ์ ๋ฌ๋ฆฌํด๋ณด๋ฉฐ
- ๊ทธ๋ผ ์ด์ ์ฝ์ด์๋ฅผ 1๊ฐ๋ถํฐ 20๊ฐ๊น์ง ๋ฌ๋ฆฌํด๊ฐ๋ฉฐ ์คํํด๋ณด์.
- ์คํ ํ๊ฒฝ์ i7-13700H
- ๊ทผ๋ฐ ๋งค๋ฒ ๋์ปค ์ปจํ ์ด๋ ๋ค์ด๊ฐ๋ค๊ฐ ๋น๋ ์๋ก ํ๋ค๊ฐ ๋์๋ค๊ฐ ํ๊ธฐ ๊ท์ฐฎ์ผ๋ ์๋ํ ํด๋ณด์
- ๋จผ์ ์คํ ํ ๋ฒ์ ์ํ์ ํ๋์ ์คํฌ๋ฆฝํธํ๋ฅผ ํ๋ค.
docker run -ti --rm \ --cpuset-cpus="0-$1" \ --name my-running-app-2204 \ -v $PWD:/usr/src/myapp \ cpp-experiment:22.04 \ /bin/bash -c "cd /usr/src/myapp/build && \ rm -rf * && \ cmake .. && \ make -j$num_cores && \ ./main" echo "" echo We used 0 to $1 cores
- ์ด๋ ๊ฒ ํ๋ฉด ๋์ปค์ปจํ
์ด๋ ์ง์
ํ bash ํฐ๋ฏธ๋์์ ๋๊ธฐํ๋ ๊ฒ์ด ์๋๋ผ main์ ๋น๋ํ๊ณ ์คํํ๊ณ ์ข
๋ฃํ๊ณ ๋น ์ ธ๋์จ๋ค.
--rm
์ต์ ์ ์ฃผ์๊ธฐ ๋๋ฌธ์ ์ปจํ ์ด๋๋ ํ ์ผ์ ๋คํ๊ณ ์ข ๋ฃ ํ ์ญ์ ๋๋ค.
- ์ด ์คํฌ๋ฆฝํธ๋ฅผ
run_tbb.22.04_auto.sh
๋ผ๊ณ ํ์.
- ์ด๋ ๊ฒ ํ๋ฉด ๋์ปค์ปจํ
์ด๋ ์ง์
ํ bash ํฐ๋ฏธ๋์์ ๋๊ธฐํ๋ ๊ฒ์ด ์๋๋ผ main์ ๋น๋ํ๊ณ ์คํํ๊ณ ์ข
๋ฃํ๊ณ ๋น ์ ธ๋์จ๋ค.
- ๊ทธ ๋ค์ ์ด๋ ๊ฒ ํ๋ค์ ์ด๊ฑธ ์คํํ๊ณ ์ปคํผํ๋ชจ๊ธ ๋ง์๊ณ ์ค๋ฉด ๋๋ค.
#!/bin/bash # 0๋ถํฐ 19๊น์ง ๋ฐ๋ณต for i in {0..19} do echo "Running with 0 to $i cores" ./run_tbb.22.04_auto.sh $i echo "" done
- ๊ทธ ๋ค์ terminal ์ ์ถ๋ ฅ๋ ํ
์คํธ ๊ฒฐ๊ณผ๋ฌผ์ ๋์ถฉ ๋ณต์ฌํด์ ChatGPT์๊ฒ ๊ทธ๋ ค์ค๋ผ๊ณ ๋งํ๋ฉด
- ํด์
- note: ์ผ๋จ ๊ฐ ๊ฐ๋ก์ถ ๋ฐ์ดํฐํฌ์ธํธ๋ง๋ค ์ฌ๋ฌ๋ฒ ์คํํด์ ํ๊ท ๋ธ๊ฒ ์๋๋ผ ํ๋ฒ๋ง ์คํํ๊ธฐ ๋๋ฌธ์ + ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ๋ง์ด ๋๊ณ ์๋ ์ํ์์ ๊ทธ๋ฅ ์คํํ๊ธฐ ๋๋ฌธ์ ๋ ธ์ด์ฆ๊ฐ ์์ ์ ์๋ค (์: x=19).
- ์ ์ฒด์ ์ธ ๊ฒฝํฅ๋ง ๋ณด๋ฉด ๊ทธ๋๋ ํ์ฐํ ๋ณด์ธ๋ค.
- par ์ด๋์ด ํ์คํ ์์๋ค.
- unseq (๊ฒ์ ) ์ seq์ ๋นํด ๋์ถฉ plot์ด ์๋์ ๊ฒฝํฅ์ด ์์นํ๊ธด ํ์ง๋ง ๋น์ทํด๋ณด์ธ๋ค.
- ps. unseq (~ simd) ์์ฒด๋ single core ์์ ์๋ํ๋ ๊ฒ์ผ๋ก ์๊ณ ์๋ค. ์ด ํ์คํฌ๊ฐ vectorized ๋๊ธฐ์ ์ ํฉํ ํ์คํฌ์ธ์ง ์๋์ง๋ ์ ๋ชจ๋ฅด๊ฒ ๊ณ ์ผ๋จ ์คํ์ ์ผ๋ก ์ด๋ ๊ฒ ๊ฒ์ฆํด๋ณด๊ณ ๋์ด๊ฐ๋ ์๋ฐ์โฆ ์์ง๋ง ์ถํ์ ๊ณต๋ถํด๋ณด๋๋ก ํ์.
- ์ฝ์ด 1๊ฐ์์ 2๊ฐ, 3๊ฐ๊ฐ ๋ ๋๊น์ง๋ ์ ์งํ๊ฒ n ๋ฐฐ์ ๊ฐ๊น์ด ์ด๋์ ๋ณด์๋ค.
- ๋ฌผ๋ก ์ด๋ ํ์คํฌ๋ง๋ค ๋ค๋ฅผ ์ ์์ผ๋ ์ธก์ ์ ํตํด ํ๋จํด์ผ ๋๊ฒ ๋ค.
- ์ฝ์ด๋ฅผ 20๊ฐ ์ด๋ค๊ณ ํด์ ๋ค์ธ ๋ ธ๋ ฅ๋๋น 20๋ฐฐ์ ์ด๋์ด ์์ง๋ ์์์ ์๋ฏธํ๋ค.
- ํด์
7-2. Ablation 2: core ์ ๋ฌ๋ฆฌํด๋ณด๋ฉฐ on ๋ค๋ฅธ ์์
- 500๋ง๊ฐ ํฌ์ธํธ์ ์ขํ๋ฅผ ๋ณํํด๋ณด์.
#include <array> #include <chrono> #include <execution> #include <iostream> #include <valarray> struct Point3D { std::valarray<double> coordinates; Point3D(double x, double y, double z) : coordinates({x, y, z}) {} }; using Matrix3x3 = std::array<std::valarray<double>, 3>; Point3D applyTransformation(const Point3D& point, const Matrix3x3& rotationMatrix, const Point3D& translation) { std::valarray<double> rotated(3); for (int i = 0; i < 3; ++i) { rotated[i] = (rotationMatrix[i] * point.coordinates).sum(); } return Point3D(rotated[0] + translation.coordinates[0], rotated[1] + translation.coordinates[1], rotated[2] + translation.coordinates[2]); } int main() { // ์์ ๋ฐ์ดํฐ: n๊ฐ 3D ํฌ์ธํธ std::vector<Point3D> points(5'000'000, Point3D(1.0, 2.0, 3.0)); // ํ์ ํ๋ ฌ ๋ฐ ์ด๋ ๋ฒกํฐ ์ ์ Matrix3x3 rotationMatrix = {std::valarray<double>{0, -1, 0}, std::valarray<double>{1, 0, 0}, std::valarray<double>{0, 0, 1}}; Point3D translation(1.0, 2.0, 3.0); // ๋ณํ ์์ ์๊ฐ ์ธก์ auto start = std::chrono::high_resolution_clock::now(); // ๋ชจ๋ ํฌ์ธํธ์ ๋ํด ๋ณํ ์ ์ฉ std::for_each(std::execution::par /* CHANGE HERE! */, points.begin(), points.end(), [&rotationMatrix, &translation](auto& point) { point = applyTransformation(point, rotationMatrix, translation); }); // ๋ณํ ์ข ๋ฃ ์๊ฐ ์ธก์ auto end = std::chrono::high_resolution_clock::now(); // ์์๋ ์๊ฐ ๊ณ์ฐ ๋ฐ ์ถ๋ ฅ auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start) .count(); std::cout << "Transformations completed in " << duration << " ms" << std::endl; return 0; }
- ๊ฒฐ๊ณผ
- ์ด ์คํ์์๋ vectorization ์ ์๋ํ๋ ๊ฒ (==
unseq
) ์ด ์๊ฐ์ ๋ ์ก์๋จน์๋ค. par
์ฌ์ฉ์ ์ญ์ ์ด๋ฐ 3-4 ์ฝ์ด ์ ๋๊น์ง ์ ํ์ ์ธ ์ฑ๋ฅ์ด๋์ด ์๊ณ ์ดํ์๋ under linear ํ๋ค.
- ์ด ์คํ์์๋ vectorization ์ ์๋ํ๋ ๊ฒ (==
7-3. Ablation 3: ๋ค๋ฅธ ๋จธ์
- AMD Ryzenโข 5 7530U ๋
ธํธ๋ถ์์๋ TBB๊ฐ ์ ์ค์น๋์๋ค.
- ์์ ์ดํ๋ฆฌ์ผ์ด์ ๋ค์์ ์ฑ๋ฅ ์ด๋์ ์ญ์ ๊ด์ฐฐํ ์ ์์๋ค.
๊ฒฐ๋ก
- C++17์ ๋์
๋ execution policy๋ c++ ์ functional ํ algorithm์ ๊ฒฐํฉํ์ฌ ์ฌ์ฉํ๊ธฐ ์ข๋ค.
- ์ฌ์ฉ์๊ฐ ๋ค์ด๋ ์ฝ๋ ์์ฑ์์์ ๋ ธ๋ ฅ์ ๊ฑฐ์ ์์ผ๋ฉด์ ๋ฉํฐ์ฝ์ด ์ด๋์ ์ฝ๊ฒ ์ฑ๊ธธ ์ ์๋ค.
- (gcc์ ๊ฒฝ์ฐ) execution policy๋ฅผ ์ปดํ์ผ ํ๊ธฐ ์ํด์๋ tbb ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋งํฌํด์ผ ํ๋ค.
- gcc ๋ฒ์ ๊ณผ tbb ๋ฒ์ ์ ์ ๋ง์ถฐ์ฃผ์. ํน์ apt-get ์ผ๋ก ์ค์นํ๋๋ผ๋ gcc ์ tbb ๋ฒ์ ์ด ๊ฐ๊ฐ ์ด๋ ํ์ง ์ต๊ด์ ์ผ๋ก ๊ด์ฐฐํ๊ณ ๋์ด๊ฐ์.
- ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์ค์นํ TBB ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์ ๋ก ์ ์๋ํ๋์ง ๊ธฐ๋ณธ์ ์ธ ๋ฒค์น๋งํฌ ํ ์คํธ์ฝ๋๋ค (์์์๋ ๋ ๊ฐ๋ฅผ ์๊ฐ) ์ ์ง์ ๊ตฌ์ฑํ๊ณ ์คํํด๋ณด์๋ค.
- ์ค์ต 2ํธ์์๋ oneTBB์ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค ๋ฐ ๋ณ๋ ฌ์ฒ๋ฆฌ์ ๊ดํ ์ข ๋ ์ด๋ก ์ ์ธ ๋ถ๋ถ์ ๋ํด ์์๋ณด์.