๋ชจ๋ํ๊ฒ GPU ๋ณ๋ ฌ์ฒ๋ฆฌ ํ์
- CUDA ์ง์ ์ง๋ ๊ฒ๋ ์ข์ง๋ง
- ์ข ๋ ํธํ๊ณ ์ถ๋ค.
๊ฐ์
- SLAM์ ํ๋ค๋ณด๋ฉด ์ผ์ ๋ฐ์ดํฐ๋ก๋ถํฐ ์๋ง๊ฐ์์ ์๋ฐฑ๋ง๊ฐ๊น์ง raw data ๋ค์ ๋ค๋ฃฐ ์ผ์ด ๋ง๋ค.
- ์๋ฅผ ๋ค์ด์, cleaned static point cloud map์ ๋ง๋ค๊ธฐ ์ํด ์ํํ๋ Removert (IROS 2020) ๋ฅผ ๊ตฌํํ ๋, submap ์ ๋ง๋ค๊ณ ์ด๋ฅผ ํ ๋
ธ๋์ viewpoint ์ projectionํด์ projective range image๋ฅผ ์ป์์ด์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ 100m ์ ๋๋ง ์์๋ ์๋ธ๋งต์ ํฌ์ธํธ ๊ฐ์๋ 500๋ง๊ฐ์์ 1000๋ง๊ฐ๊ฐ ๋๋ค. ์ด ๊ณผ์ ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด์ OpenMP๋ฅผ ์ฌ์ฉํ์์ง๋ง, ์ฌ์ ํ ๋๋ฆฐ๊ฒ ์์ฌ์ ๋ค (
removert
๋ ์ฌ์ ํ ๋๋ฆฐ ์ฑ๋ก ๋จ์ ์๋ค).
- ์๋ฅผ ๋ค์ด์, cleaned static point cloud map์ ๋ง๋ค๊ธฐ ์ํด ์ํํ๋ Removert (IROS 2020) ๋ฅผ ๊ตฌํํ ๋, submap ์ ๋ง๋ค๊ณ ์ด๋ฅผ ํ ๋
ธ๋์ viewpoint ์ projectionํด์ projective range image๋ฅผ ์ป์์ด์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ 100m ์ ๋๋ง ์์๋ ์๋ธ๋งต์ ํฌ์ธํธ ๊ฐ์๋ 500๋ง๊ฐ์์ 1000๋ง๊ฐ๊ฐ ๋๋ค. ์ด ๊ณผ์ ์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด์ OpenMP๋ฅผ ์ฌ์ฉํ์์ง๋ง, ์ฌ์ ํ ๋๋ฆฐ๊ฒ ์์ฌ์ ๋ค (
- ๊ทผ๋ณธ์ ์ผ๋ก ์ด๋ฌํ ์์ ์๋ CPU (๋ฅผ ์๋ฌด๋ฆฌ ์์ญ์ฝ์ด ๋ณ๋ ฌ ์ฒ๋ฆฌ ํ๋ค๊ณ ํ๋๋ผ๋ ๋๋ฆฌ๋ค) ๊ฐ ์๋๋ผ GPU๋ฅผ ์ฌ์ฉํด์ผ ํจ์ ๋๋ผ๊ณ ์๋ ์ฐจ์
- Thrust ๋ผ๋ library๋ฅผ ์ค์ตํด๋ณด์๋ค.
- CUDA library๋ฅผ ํ๋ฒ ๋ ํ์ด๋ ๋ฒจ๋ก ๊ฐ์ผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- Modern C++ (C++11 ์ด์) ์คํ์ผ๋ก ๊ตฌํ๊ฐ๋ฅํ ๊ฒ์ด ํน์ง์ด๋ค. std::algorithm ์ ๋ฌธ๋ฒ๊ณผ ์๋นํ ๋ฎ์์๋ค.
- ์ฝ๋ ๋น๊ต ์์ (์๋ ์ค์ต๋น๋์ค์์ ์ฌ์ฉํ): ์ซ์ 10์ต๊ฐ ๋ํ๊ธฐ
- ps. ๋ณด๋ค์ํผ ์ฌ์ฉ๋ฒ์ ๋๋ฌด ์ฝ๊ณ ์ง๊ด์ ์ด๋ค (๋น๋ํ๋๋ฐ ์๊ฐ์ด ๋ ๊ฑธ๋ ธ๋ค ใ ใ ).
- ์ฝ๋ ๋น๊ต ์์ (์๋ ์ค์ต๋น๋์ค์์ ์ฌ์ฉํ): ์ซ์ 10์ต๊ฐ ๋ํ๊ธฐ
- ๊ทธ๋ฆฌ๊ณ CUDA ์์ ๋ค์์ nvcc ๋ก ์ปค๋งจ๋๋ผ์ธ์์ ๋น๋ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๋ฐ, modern C++ ๋ฐ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ ํจ๊ป thrust ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์๋ฌด๋๋ cmake๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข ๋ ๊น๋ํ๋ค. cmake ๋ฅผ ์ฌ์ฉํด์ ์ค์ต์ ์งํํด๋ณด์ (== CMakeLists.txt ๋ฅผ ๋ง๋ค์).
์ค์ต
- ์ค์ต ๋ฆฌํฌ: gisbi-kim/thrust_examples
์ค๋น๊ณผ์
- Thrust ๋น๋
- ๊ณต์ github readme ์ ๋์์๋๋๋ก ํ๋ฉด ๋๋ค.
- ์ด ๋ ํด๋ฆฐํ ํธ์คํธ ์ ์ง๋ฅผ ์ํด docker ์ฌ์ฉ์ ๊ถ์ฅํ๊ณ , ์๋ ์์ ์์๋ docker ๋ก ์ํํด๋ณผ ๊ฒ์ด๋ค.
- ์ฒซ๋ฒ์งธ ๋ฐฉ๋ฒ์ธ ci/local/build.bash ๋ฅผ ํ๋๊น ๋ญ๊ฐ ์๋์ ๊ทธ๋ฅ ์๋ ๋ฐฉ๋ฒ๋๋ก ์คํ ๋ฐ์ด์คํ (git clone ํ๊ณ cmake .. ํ๊ณ make install) ์ผ๋ก ์ง์ ๋น๋ํ์๋ค.
- ๋์ถฉ ์๋ฌด ์์ ์ด๋ฏธ์ง (e.g.,
docker pull ubuntu:jammy
) ๋ฅผ ๋ฐ์๋๊ณ docker run ํด์ ๋ค์ด๊ฐ์.- ๊ทผ๋ฐ ๋๋ฌด ์๋ฌด๊ฒ๋ ์๋ ๋ฒ ์ด์ค๋ฅผ ๋ก๊ฒจ์ค๋ฉด ์ข ๊ท์ฐฎ๊ณ , ๋๋ ci/local/build.bash ๋ฅผ ํ๋ ์ด๊ฒ์ ๊ฒ์ด ์ ์ค์น๋์ด์๋ ์ด๋ฏธ์ง๊ฐ ํ๋ ๋ก๊ฒจ์์ ธ์ ๊ทธ๊ฒ์ ๋ฒ ์ด์ค๋ก ์ฌ์ฉํ๋ค.
- runํ ๋ gpu ๋ฅผ ์ก์์ฃผ๋ฉด์ ๋ค์ด๊ฐ์ผ ํ๋ค. ์ฆ, ์ต์
์ผ๋ก
--gpus all
๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.- ์์: docker_run.sh
- docker runํด์ image ์์ผ๋ก ๋ค์ด๊ฐ ๋ค์์, ๋ ํ๋ฏ์ด git clone ํ๊ณ cmake .. ํ๊ณ make install ํ๋ค.
- ๊ทธ๋ฐ๋ฐ compute_90์ด ์๋๋ค๋ ์ด๋ค ์๋ฌ๊ฐ ๋์์ ccmake .. ์์ config ๋ฅผ ๋ค์ด๊ฐ ๋ค์์ 90 ์ต์
์ OFFํด์ฃผ์๋ค. ์๋ง ๋ด๊ฐ ์๋ ์ํคํ
์ฒ(6.1)์ธ gtx1080ti ๋ฅผ ์ฐ๊ณ ์์ด์ ์ต์ ์ํคํ
์ฒ (9๋ฒ๋?) ์์ ์ง์ํ๋ ๋ญ๊ฐ๊ฐ ๋น๋๊ฐ ์๋๋ ๋๋์ด ๋ ๋ค.
- ๊ทธ๋ฐ๋ฐ compute_90์ด ์๋๋ค๋ ์ด๋ค ์๋ฌ๊ฐ ๋์์ ccmake .. ์์ config ๋ฅผ ๋ค์ด๊ฐ ๋ค์์ 90 ์ต์
์ OFFํด์ฃผ์๋ค. ์๋ง ๋ด๊ฐ ์๋ ์ํคํ
์ฒ(6.1)์ธ gtx1080ti ๋ฅผ ์ฐ๊ณ ์์ด์ ์ต์ ์ํคํ
์ฒ (9๋ฒ๋?) ์์ ์ง์ํ๋ ๋ญ๊ฐ๊ฐ ๋น๋๊ฐ ์๋๋ ๋๋์ด ๋ ๋ค.
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋น๋ํ๋ ๋ฐ์ ๊ฝค๋ ๊ธด ์๊ฐ (i5 11gen์์ 8core๋ก 2-3์๊ฐ ๊ฑธ๋ฆฐ ๋ฏํ๋ค (example ๋ค์ ๋ค ๋น๋ํ๋๋ผ..)) ์ด ์ง๋ ํโฆ ๋ญ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ make install ์ ๋ค ๋์๋๋ฐ, ์ดํ๋ฆฌ์ผ์ด์
(์๋ ์๊ฐํ ) ๋น๋๋ฅผ ํ๊ณ ์คํํ๋ ค๊ณ ๋ณด๋ forward compatible ํ HW๋ฅผ ์ฐพ์ ์ ์๋ค๋ ์๋ฌ๊ฐ ๋ ์ ์๋์๋ค.
- cuda toolkit version๊ณผ ์ด์ ๋์๋๋ nvidia driver ๋ฅผ ๋ค์ ์ค์นํด์ฃผ๋ ํด๊ฒฐ๋์๋ค. ๋ด ๊ฒฝ์ฐ gtx1080ti์ cuda 11.4, nvidia driver 470 ์ ์ฌ์ฉํ์๋ค.
- ๊ณต์ github readme ์ ๋์์๋๋๋ก ํ๋ฉด ๋๋ค.
- CMake๋ฅผ ์ฌ์ฉํด์ main code ๋น๋
- ์ฒ์ ์จ๋ณด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ CMakeLists.txt ๋ฅผ ๋ง๋๋ ๊ฒ ๋ค ํ๊ณ ๋์ ๋ณด์ผ๋ฌํ๋ ์ดํธ๊ฐ ์์ผ๋ฉด ์์ฒญ ์ฌ์ด๋ฐ, ์ฒ์ ํ ๋ฒ ํ๊ธฐ๊ฐ ๋งค์ฐ ์ผ์ด๋ค.
- ์ญ์ ์ด๋ด ๋๋ ๊ณตํ์ ํํธ ๊ฐ ์๋ค. ์ด๊ฑธ ๋ณด๊ณ ๋์ถฉ ๋ฐ๋ผํ๋ฉด ์๋์ ๊ฐ์ด ๋๋ค.
- code: CMakeLists.txt
- ์ฒ์์ ์
thrust_creat_target
์ ๊ท์ฝ์ ์ดํดํ์ง ๋ชปํด์ ์ข ํค๋งค์๋ค. DEVICE๋ค์ CPP๋ฅผ ๋ถ์ด๋ฉด thrust code ๋ฅผ ์ฌ์ฉํ๋๋ผ๋ cpu๋ง ์ฌ์ฉํ๋ค (ps.DEVICE CUDA
๋ฅผDEVICE CPP
๋ก ๋ฐ๊พธ๊ณmain_gpu_thrust.cu
๋ฅผmain_gpu_thrust.cpp
๋ก ์ด๋ฆ๋ฐ๊ฟ์ ์ง์ ๋น๋ ํด๋ณด๋ผ! ๋ถ๋ช thrust ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ง๋ง cpu๋ฅผ ์ฌ์ฉํ ๋์ ๋์ผํ ์๊ฐ์ด ์์๋จ์ ์ ์ ์๋ค). DEVICE CUDA
์ธ src์ ๋ํด์๋, Modern C++ ๋ฌธ๋ฒ์ ์ฌ์ฉํ๊ณ main์ด ๋ค์ด์๋ ํ์ผ์ด์ง๋ง.cu
ํ์ฅ์๋ก ์ด๋ฆ์ ์ง์ด์ค๋ค. ์ ์ง๋ชจ๋ฅด์ง๋ง.cpp
๋ก ๋๋๊ฒ ํ๋๊น ์ปดํ์ผ์ด ์๋์๋ค.- ์๋ฅผ ๋ค์ด, ๊ณต์ ๋ฆฌํฌ์ ์์ ์ฝ๋๋ค ๋ ๋ชจ๋ ๊ฐ๊ฐ main์ ๊ฐ์ง๋ ๋
๋ฆฝ๋ executables ๋ค์ด์ง๋ง ๋ชจ๋
.cu
ํ์ฅ์๋ฅผ ๊ฐ์ง์ ์ ์ ์๋ค.- ps. ๋ฐฉ๊ธ ๊ตฌ์ถํ CMake project directory๋ฅผ ํ์ฉํด์ ๊ณตํ์ ๋ค๋ฅธ ์์ ๋ค์ ๋ณต์ฌํด์์ main_gpu.cu ์์ ๋ด์ฉ์ ๋ฐ๊ฟ์ ์ถ๊ฐ์ ์ผ๋ก ๋ ์ค์ตํด๋ณด๋ผ!
- ์๋ฅผ ๋ค์ด, ๊ณต์ ๋ฆฌํฌ์ ์์ ์ฝ๋๋ค ๋ ๋ชจ๋ ๊ฐ๊ฐ main์ ๊ฐ์ง๋ ๋
๋ฆฝ๋ executables ๋ค์ด์ง๋ง ๋ชจ๋
- ์ฒ์์ ์
์ค์ต ์์
- ์๋ฌดํผ ์์ ๊ณผ์ ์ ๊ฑฐ์ณ์ ๊ฐ๋จํ ์์ ์ธ, 10์ต๊ฐ ์ซ์ ๋ํ๊ธฐ๋ฅผ ํด๋ณด์๋ค.
std::uniform_int_distribution<> dist(0, 9999)
์ ๊ฐ์ด 0์์ 9999 ์ฌ์ด์ int ๋ค์ด 10์ต๊ฐ ์๋ค.
๊ฒฐ๊ณผ
- ํ ๋๋ง๋ค ๋ค๋ฅด์ง๋ง, ๋์ถฉ ์ด์ ๋ ๋์จ๋ค. GPU๋ก ๋๋ฆด ๋ 20๋ฐฐ ์ ๋ ๋น ๋ฅด๋ค.
- ์ ์์์์ ๋์ค์ง๋ง, ๊ผญ ์ํ์ด 10์ต๊ฐ์ฉ ์์ง ์๋๋ผ๋, ์ฆ 1์ต๊ฐ ์ ๋์์๋ ์ฌ์ ํ 20-30๋ฐฐ ๋น ๋ฅธ ๋ชจ์ต์ ๋ณด์ฌ์ค๋ค.
ps. ์ค์ต2
- ์ฐธ๊ณ ๋ก cpp17๋ถํฐ ๋ค์ด์จ execution policy๋ฅผ ํตํด์ cpu ์์์ ๋ณ๋ ฌ์ฒ๋ฆฌ๋ฅผ ์ํํด๋ณด์๋ค.
- ๋ค๋ง, ์ด ๋ฌธ๋ฒ์ ์ฌ์ฉํ ๋๋ compiler ๊ฐ ์๊ฐํ๊ธฐ์ ๋ณ๋ ฌ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ฉด ์ต์ ์ ๋คํด์ฃผ๊ฒ ๊ณ , ์๋๋ฉด ์ํด์ค ์๋ ์๋ค, ๋ผ๋ โ๊ณ ๋ ค๋ ํด๋ณด๊ฒ ๋คโ ์ ๋์ ์๋ฏธ๋ก ์๊ฐํด์ผ ํ๋ค.
- ๋ฉ์ธ ๋ธ๋ก์ ๋ค์๊ณผ ๊ฐ๋ค.
auto do_sum = [&]() { Number init = 0; Number sum = std::transform_reduce( std::execution::par, vec.begin(), vec.end(), init, std::plus<Number>(), [](const Number& num) { return num; }); return sum; };
- ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์๋ค. 3๋ฒ์ฉ ์ํํ์ ๋,
- ์ด๋์ด ๊ทธ๋ฆฌ ํฌ์ง ์์์ ์ ์ ์๋ค.
- ์ญ์ (๋น์ฐํ) GPU๋ฅผ ์ฌ์ฉํด์ผ๋ง ์ ๋ฆฌํ ๋ณ๋ ฌ์ฒ๋ฆฌ๊ฐ ์๋ค. ์ฟ ๋ค ์ค์น์ ๋ง์์ ์ฅ๋ฒฝ(๊ท์ฐฎ์)์ ์ด์ ๋ ํ๋ฌผ์!
- ps. ๊ทธ๋์ ๋ ChatGPT์๊ฒ ๊ถ๊ธํ ๊ฑธ ๋ฌผ์ด๋ณด์๋ค.
- ps. ๊ทธ๋์ ๋ ChatGPT์๊ฒ ๊ถ๊ธํ ๊ฑธ ๋ฌผ์ด๋ณด์๋ค.
- ์ญ์ (๋น์ฐํ) GPU๋ฅผ ์ฌ์ฉํด์ผ๋ง ์ ๋ฆฌํ ๋ณ๋ ฌ์ฒ๋ฆฌ๊ฐ ์๋ค. ์ฟ ๋ค ์ค์น์ ๋ง์์ ์ฅ๋ฒฝ(๊ท์ฐฎ์)์ ์ด์ ๋ ํ๋ฌผ์!
- ์ด๋์ด ๊ทธ๋ฆฌ ํฌ์ง ์์์ ์ ์ ์๋ค.
- ๋ฉ์ธ ๋ธ๋ก์ ๋ค์๊ณผ ๊ฐ๋ค.
๊ฒฐ๋ก
- ๋ฅ๋ฌ๋ ์ํด๋ GPU ์ ์ฐ๋ฉด ์ข๋ค.
- ps. ์์ฆ์ (2018๋ ์ด๋ด ๋ ๋๋น โฆ) nvidia driver ์ญ์ ๋ฐ ์ฌ์ค์น๋ ๊ธ๋ฐฉ ํธํ๊ฒ ๋๋๋ผ.
TODO
- ๋ค๋ฅธ ๊ณต์ ์์ ๋ค๋ ๋๋ ค๋ณด์.
- Robotics ์์ ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ๊ดํ ํํ ๋ฆฌ์ผ์ ๋ง๋ค์ด ๋ณด์.