Compiler Explorer (godbolt) ์์ ํธํ๊ฒ ์ฐ์ตํ์
- ๋ CUDA ๋ฐ Thrust ๊ณต๋ถ๋ฅผ ๋น ๋ฅด๊ณ ํธํ๊ฒ + ์ด๋์์๋ ํ๊ณ ์ถ์ง
- ๋น๋ํ๊ฒฝ์ ๊ตฌ์ถํ๋ ๊ฑด ๊ท์ฐฎ๋คโฆ
- ๋ผ๋ ๋ง์์ด ๋ค ๋
ํฐ์
- โฆ ๋ผ๋ ๋ง์์ด ๋ค ๋
-
์๋์ฒ๋ผ ์ค์ต์ ํ๋ฉด ๋๋ค. (์ปดํ์ผ์ด ๋๋ ๋์ ์ ์ ๊ธฐ๋ค๋ ค์ผ ํ๋ค)
๊ฐ์
- ์ต๊ทผ (2023๋ 3๋ถ๊ธฐ) thrust ๊ฐ CCCL (CUDA C++ Core Libraries) ์ด๋ผ๋ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํธ์ ๋์๋ค.
- thrust ๋ CUDA programming ์ ์ข ๋ modern C++ ์ค๋ฝ๊ฒ ํ ์ ์๊ฒ ์ง์ํด์ฃผ๋ library์ด๋ค.
- ์๋ฅผ ๋ค์ด, ๊ณต์ ๊นํ๋ธ์ ์๋ ์์ ๋ฅผ ๊ฐ์ ธ์ ๋ณด์๋ฉด, ์ปค์คํ
์ปค๋์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ์์ ํ๋ค.
-
ps. GPT4์๊ฒ thrust ์ ๊ฐ์ ๊ณ ์์ค API๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์์ ์ ๋ํด ์ข ๋ ์ค๋ช ์ ๋ถํํด๋ณด์๋ค.
Thrust์ ๊ฐ์ ๊ณ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ปค์คํ CUDA ์ปค๋์ ์ง์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ๋ช ๊ฐ์ง ์ค์ํ ์ฅ์ ์ด ์์ต๋๋ค. ์ฌ๊ธฐ ๋ ๊ฐ์ง๋ฅผ ํฌํจํ์ฌ ๋ช ๊ฐ์ง ์ฅ์ ์ ์ค๋ช ํด ๋๋ฆฌ๊ฒ ์ต๋๋ค:
-
์๋ ๋๊ธฐํ ๊ด๋ฆฌ: Thrust์ ๊ฐ์ ๊ณ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ด๋ถ์ ์ผ๋ก ํ์ํ ๋๊ธฐํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ ํ๋ก๊ทธ๋๋จธ๊ฐ CUDA ์คํธ๋ฆผ๊ณผ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์์๋ ๋๋๋ก ํด์ค๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๊ฐ GPU์์ CPU๋ก ๋๋ ๊ทธ ๋ฐ๋๋ก ์ ์ก๋๋ ๊ฒฝ์ฐ, Thrust๋ ์ ์ ํ ๋๊ธฐํ ์ ์ ์๋์ผ๋ก ์ฝ์ ํ์ฌ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
-
๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ์ฝ๋: Thrust๋ C++ ํ์ค ํ ํ๋ฆฟ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(STL)๊ณผ ์ ์ฌํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ฌ, ํ๋ก๊ทธ๋๋จธ๊ฐ ์ต์ํ ํ์์ผ๋ก GPU ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ๊ฐ ํฅ์๋๋ฉฐ, ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ญ๋๋ค.
-
ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ: Thrust๋ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๋ฅผ ์ง์ ๊ด๋ฆฌํ๋ ๋ณต์ก์ฑ์ ํผํ ์ ์๊ฒ ํด์ค๋๋ค. ๋ํ, Thrust๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ํจํด์ ์ต์ ํํ์ฌ GPU์ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
-
์ฑ๋ฅ ์ต์ ํ: Thrust๋ ๋ด๋ถ์ ์ผ๋ก ๋ค์ํ ์ต์ ํ ๊ธฐ๋ฒ์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํ์์๋ ๋ธ๋ก ํฌ๊ธฐ, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ ๋ฑ ์ฌ๋ฌ ์์๊ฐ ์๋์ผ๋ก ์ต์ ํ๋ฉ๋๋ค. ์ด๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๋ฌํ ์ธ๋ถ ์ฌํญ์ ๋ํด ์ ๊ฒฝ ์ฐ์ง ์๊ณ ๋ ํจ์จ์ ์ธ GPU ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํด์ค๋๋ค.
-
๋์ ๋ฒ์์ ๋ณ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ง์: Thrust๋ ์ ๋ ฌ, ๊ฐ์, ์ค์บ ๋ฑ ๋ค์ํ ๋ณ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ํ๋ก๊ทธ๋๋จธ๋ ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์์ผ๋ฉฐ, ์ด๋ GPU ํ๋ก๊ทธ๋๋ฐ์ ์ง์ ์ฅ๋ฒฝ์ ๋ฎ์ถ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
-
ํด๋์ฑ๊ณผ ํธํ์ฑ: Thrust ์ฝ๋๋ ๋ค์ํ CUDA ๋ฒ์ ๊ณผ GPU ์ํคํ ์ฒ์์ ํธํ๋ฉ๋๋ค. ์ด๋ ํ๋ก๊ทธ๋จ์ด ๋ค์ํ ํ๋์จ์ด ๋ฐ ์ํํธ์จ์ด ํ๊ฒฝ์์๋ ์์ ์ ์ผ๋ก ์๋ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ข ํฉ์ ์ผ๋ก, Thrust๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ณต์กํ ํ๋์จ์ด ์ธ๋ถ ์ฌํญ์ ๋ํด ๊ฑฑ์ ํ์ง ์๊ณ , ๊ณ ์ฑ๋ฅ GPU ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๋น ๋ฅด๊ณ ์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
-
- ์๋ฅผ ๋ค์ด, ๊ณต์ ๊นํ๋ธ์ ์๋ ์์ ๋ฅผ ๊ฐ์ ธ์ ๋ณด์๋ฉด, ์ปค์คํ
์ปค๋์ ์์ฑํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๊ฐ๊ฒฐํ๊ณ ์์ ํ๋ค.
- ์์ ๋ธ๋ก๊ทธ ํํ ๋ฆฌ์ผ ์์ ์ง์ ๋น๋ํ๊ณ ์ค์ตํ๋ ์์๋ฅผ ํ๋ ๋ค๋ฃจ์์๋ค.
- ๊ทธ๋ฐ๋ฐ C++์ ์ฐธ ์ฌ๋ฐ๋๋ฐ ๋ ๋น๋ํ๊ฒฝ ๊ตฌ์ถํ๋ ๊ฒ ๊ท์ฐฎ๋ค. ๊ทธ๋์ ๊ณต๋ถํ๋ ๋ฐ๊น์ง ๋ง์๋จน๊ฒ ๋๋ ๊ฒ์ด ์ด๋ณด์๋ค์๊ฒ ์ฅ๋ฒฝ์ธ ๋ฏ.
- ๊ฒ๋ค๊ฐ CUDA๊ณต๋ถ๋ฅผ ํ๊ณ ์ถ์ผ๋ฉด NVIDIA GPU๋ฅผ ๊ฐ์ง๊ณ ์๋ ๋จธ์ ์์ ํด์ผ ํ๋, ๋ง์ฝ ์ด๋ฐ ๋จธ์ ์ ๊ฐ์ง๊ณ ์์ง ์๋ค๋ฉด ์ญ์ ์ฅ๋ฒฝ์ด ๋๊ฒ ๋ค.
- ๊ทธ๋์ Compiler Explorer ๋ฅผ ์ถ์ฒํ๋ค.
Compiler Explorer ๋
- Compiler Explorer ๋ Matt Godbolt ๋ผ๋ ๋ถ๊ป์ ๋ง๋์ ํด๋ก์จ ์จ๊ฐ ์ธ์ด์ ์ปดํ์ผ ๋ฐ ์คํ์ ์ํํด์ฃผ๋ ์น ํด์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- ํ์ฌ ๋ค์ํ ์ธ์ด๋ฅผ ์ง์ํ๊ณ ์์ง๋ง ๋ณดํต C/C++ ์ ์ ๋ค์ด ๋ง์ด ์ฌ์ฉํ๊ณ ์๋ค.
- ์์ธํ ์ญ์ฌ์ ๋ํด์๋ ์ ์์ง๊ฐ์ ๋ค์ ์์์ ์ถ์ฒํ๋ค.
- ์ฌ์ฉ์์
- C++ Weekly - Ep 332 - C++ Lambda vs std::function vs Function Pointer
- Lambda vs std::function vs Function Pointer ์ ์ค์ฒด๋ ๋ค๋ฅผ๊น? ์ ๋ํด์ ์ค๋ช
ํ๊ณ ์ถ์ ๋,
- ์ปดํ์ผ์ ํด๋ณด๊ณ ์ค๋ฅธ์ชฝ ์ฐฝ์ ๋ํ๋๋ ํญ๋ชฉ์์, ์ด์
๋ธ๋ฆฌ ์ธ์ด ์์ค์์ ๋ค๋ฅธ ์ด์ ๋ค์ ๋ถ์ํด์ค๋ค! ์๋๋ ์ข ์ ์ ํ๋ธ ์บก์ฒ:
- ์ปดํ์ผ์ ํด๋ณด๊ณ ์ค๋ฅธ์ชฝ ์ฐฝ์ ๋ํ๋๋ ํญ๋ชฉ์์, ์ด์
๋ธ๋ฆฌ ์ธ์ด ์์ค์์ ๋ค๋ฅธ ์ด์ ๋ค์ ๋ถ์ํด์ค๋ค! ์๋๋ ์ข ์ ์ ํ๋ธ ์บก์ฒ:
- ๊ทธ๋ฐ ์ค๋ช ๋ค์ ํ ๋ ์ ์ฉํ ํด์ด ๋๊ฒ ๋ค.
- Lambda vs std::function vs Function Pointer ์ ์ค์ฒด๋ ๋ค๋ฅผ๊น? ์ ๋ํด์ ์ค๋ช
ํ๊ณ ์ถ์ ๋,
- C++ Weekly - Ep 332 - C++ Lambda vs std::function vs Function Pointer
- ps. URL๋ https://godbolt.org/ ์ด๋ฉฐ ๊ทธ๋์ ๊ทธ๋ฅ Compiler Explorer๋ผ๊ณ ์๋ถ๋ฅด๊ณ godbolt ๋ผ๊ณ ๋ถ๋ฆฌ๊ธฐ๋ ํ๋ค.
์์ฝ
- ์ํผ ์ฌ๊ธฐ์์ ํ๋ ค๊ณ ํ๋ ์ด์ผ๊ธฐ๋ Compiler Explorer๋ CUDA build (NVCC) and run ๋ ์ง์ํ๋ค.
์ค์ต
- NVCC ์ปดํ์ผ๋ฌ๋ฅผ ์ธํ ํด๋ ์ด ๋งํฌ ๋ก ๋ค์ด๊ฐ์.
- ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ์๋ ์ฝ๋ ๋ฅผ ๋ณต์ฌํด์ ๋ถ์ฌ๋ฃ์ ๋ค์์, ๊ฒฐ๊ณผ๋ฅผ ๊ด์ฐฐํ์.
- ์ด ์์๋ point cloud ๋ฅผ spherical image ์ projection ํ๋ ์์ ์ฝ๋์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์์ญ๋ง~์๋ฐฑ๋ง ๊ทธ ์ด์์ ํฌ์ธํธ์ ๋ํด CPU์์ ์ด ์์ ์ ์ํํ๋ ค๋ฉด ๋งค์ฐ ๋๋ฆด ๊ฒ์ด๋ค.
- ๊ตฌํ์ฒด๋ฅผ ์ข ๋ ๋ค์ฌ๋ค๋ณด์.
- ์ด ์์๋ point cloud ๋ฅผ spherical image ์ projection ํ๋ ์์ ์ฝ๋์ด๋ค.
๊ตฌํ
- ์ ์ฒด ์ฝ๋ ์ค, ์ค์ ์์
ํ๋ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ด๋ ค์ธ ๊ฒ์ด 1๋ ์๋ ์ฝ๋์ด๋ค. Functor ์์ฑํ ๋ค์์ ::transform ์ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉด ๋!
- ๊ทธ๋ฌ๋ฉด
thrust::transform
๋ array๋ฅผ ์ํํ๋ฉฐ ๋์ผํ ์์ ์ ์ํํ๋ ์์ฃผ ์ ํ์ ์ธ functional programming style ์ ๊ตฌํ์ด๋ค.- ๊ทธ๋ฐ๋ฐ ์ด์ GPU์์์ ๋ณ๋ ฌ์ฒ๋ฆฌ, ๋ธ๋ก ๋๋๊ธฐ, ๋๊ธฐํ๊ฐ์ ๊ฑธ ์์์ ๋ค ํด์ฃผ๋!
- ๋ด๋ ์๋ฃํ์ด std::vector๊ฐ ์๋๋ผ thrust::device_vector ๋ผ๋ ๊ฑธ ์ฌ์ฉํ๋ค๋ ๊ฒ ์ ๋๋ง ์ ๊ฒฝ์จ์ฃผ๋ฉด ๋๋ค.
- ๊ทธ๋ฌ๋ฉด
- ps. ์์ ๊ตฌํ์ GPT4 ๊ฐ ๋ค ํด์ค ๊ฒ์ด๋ค! See the ์์
๊ธฐ
- ๋๋ถ์ cuda ๋ฐ thrust ์ API ์ด๋ฆ๋ค์ ๋ค ๋ชจ๋ฅด๋ ์ํ์์๋ ๋ฐ๋ก ๊ณต๋ถ๋ฅผ ์์ํ ์ ์์๋ค.
- Tip: ๋ค๋ง, ํ ๋ฃจ์๋ค์ด์ ์ด๋ ๋น๋๊ฐ๋ฅํ์ง ์์ (pseudo-like code) ์ฝ๋๋ฅผ ์ค ๋๊ฐ ์๋๋ฐ, ๊ทธ๋ฐ ๋ถ๋ถ์ด ์ง๋ ChatGPT ์ถ์ 1๋ ๋์์ ์ฝ๋ ์์ฑ์ ๋์๋ฐ์ ๋ ์ฝ๊ฐ ์ฐ๋ ค๋๋ ๋ถ๋ถ์ด๊ธด ํ๋ค (์ถ์ ์ดํ ๊ณ์ ๋ง์ด ์ข์์ง๊ธด ํจ). ๊ทธ๋ด ๋ ๊ฒ์ฆ์ฉ์ผ๋ก ๋ฐ๋ก godbolt ์ ๋ถ์ฌ๋ฃ๊ณ ๋น๋๊ฐ ๋๋์ง ํ์ธํ๋ฉด์ ์๋ค๊ฐ๋ค ํ๋ ๋ฐฉ์์ผ๋ก ๊ณต๋ถํ๋ ํจ์จ์ด ์ข์๋ค.
- ์ด๋ ค์ธ ๊ฒ์ด 1๋ ์๋ ์ฝ๋์ด๋ค. Functor ์์ฑํ ๋ค์์ ::transform ์ ์ธ์๋ก ๋ฃ์ด์ฃผ๋ฉด ๋!
์คํํ๊ฒฝ
- ํ์ฌ (2023.12.10) ๋ฌด๋ ค 16G์ T4 ์์์ (๋ฌด๋ฃ๋ก) ์คํํด์ฃผ๊ณ ์๋ ๊ฒ์ ์ ์ ์๋คโฆ ใ ใ ใ
- ํ์ธํ๋ ค๋ฉด (์ด๋ฐ๊ฒ๋ GPT4์๊ฒ ๋ฌผ์ด๋ณด๋ฉด ๋ค ์๋ ค์ค๋ค)
// GPU ์์ฑ ๊ฐ์ ธ์ค๊ธฐ int device; cudaGetDevice(&device); cudaDeviceProp properties; cudaGetDeviceProperties(&properties, device); std::cout << "Using GPU: " << properties.name << std::endl; // CUDA ๋ฒ์ ๊ฐ์ ธ์ค๊ธฐ int runtimeVer; cudaRuntimeGetVersion(&runtimeVer); std::cout << "CUDA Runtime Version: " << runtimeVer / 1000 << "." << (runtimeVer % 100) / 10 << std::endl; int driverVer; cudaDriverGetVersion(&driverVer); std::cout << "CUDA Driver Version: " << driverVer / 1000 << "." << (driverVer % 100) / 10 << std::endl;
-
๊ฒฐ๊ณผ:
Using GPU: Tesla T4 CUDA Runtime Version: 12.2 CUDA Driver Version: 12.2
์คํ ์ธํ
- Point ๋ฅผ N๊ฐ ๋๋ค ์์ฑํ๊ณ , ๋์ถฉ ์ ํ ์ด๋ฏธ์ง (640x480) ์ projection ํ๋ ์์.
์คํ ๊ฒฐ๊ณผ ํ๋ฉด
- godbolt ์์ ์ํ ์ ๋ค์๊ณผ ๊ฐ์ด ๊ฒฐ๊ณผ๋ ์ถ๋ ฅ๋๋ค.
์คํ ๊ฒฐ๊ณผ (์ํ ์๊ฐ)
- ๊ฒฐ๊ณผ ๊ฐ ์์ฒด๋ ์์์ด๋ ํฐ ์๋ฏธ์๊ณ ์๊ฐ์ ์ธก์ ํด๋ณด์.
cudaEventRecord
๋ผ๋ ๊ฑธ ์ฌ์ฉํ๋ฉด device (GPU)์์ ์ด๋ฃจ์ด์ง๋ code block์ ๋ํด์๋ ์๊ฐ์ ์ธก์ ํ ์ ์๋ค๊ณ ํ๋ค.- ์์
- ์์
N ์ ๋ฐ๊ฟ๊ฐ๋ฉด์
, ๊ฐ 3๋ฒ์ฉ ์ํ:- N = 1000
Memory usage at before allocation: used = 105.000000, free = 14825.562500 MB, total = 14930.562500 MB Memory usage at after allocation: used = 109.000000, free = 14821.562500 MB, total = 14930.562500 MB * Point generation time: 0.036864 ms * Spherical transformation time: 0.060384 ms * Copying to host time: 0.032896 ms Total execution time: 0.130144 ms * Point generation time: 0.016064 ms * Spherical transformation time: 0.017056 ms * Copying to host time: 0.02736 ms Total execution time: 0.06048 ms * Point generation time: 0.016192 ms * Spherical transformation time: 0.016768 ms * Copying to host time: 0.024384 ms Total execution time: 0.057344 ms
- N = 10000
Memory usage at before allocation: used = 105.000000, free = 14825.562500 MB, total = 14930.562500 MB Memory usage at after allocation: used = 109.000000, free = 14821.562500 MB, total = 14930.562500 MB * Point generation time: 0.038912 ms * Spherical transformation time: 0.057376 ms * Copying to host time: 0.091008 ms Total execution time: 0.187296 ms * Point generation time: 0.018336 ms * Spherical transformation time: 0.017312 ms * Copying to host time: 0.086208 ms Total execution time: 0.121856 ms * Point generation time: 0.018464 ms * Spherical transformation time: 0.01664 ms * Copying to host time: 0.086176 ms Total execution time: 0.12128 ms
- N = 100000
Memory usage at before allocation: used = 105.000000, free = 14825.562500 MB, total = 14930.562500 MB Memory usage at after allocation: used = 109.000000, free = 14821.562500 MB, total = 14930.562500 MB * Point generation time: 0.064512 ms * Spherical transformation time: 0.09008 ms * Copying to host time: 0.683456 ms Total execution time: 0.838048 ms * Point generation time: 0.042784 ms * Spherical transformation time: 0.045728 ms * Copying to host time: 0.723328 ms Total execution time: 0.81184 ms * Point generation time: 0.043008 ms * Spherical transformation time: 0.045056 ms * Copying to host time: 0.670624 ms Total execution time: 0.758688 ms
- N = 1000000
Memory usage at before allocation: used = 105.000000, free = 14825.562500 MB, total = 14930.562500 MB Memory usage at after allocation: used = 127.000000, free = 14803.562500 MB, total = 14930.562500 MB * Point generation time: 0.354464 ms * Spherical transformation time: 0.399936 ms * Copying to host time: 4.54739 ms Total execution time: 5.30179 ms * Point generation time: 0.323712 ms * Spherical transformation time: 0.342688 ms * Copying to host time: 4.5623 ms Total execution time: 5.2287 ms * Point generation time: 0.323584 ms * Spherical transformation time: 0.341408 ms * Copying to host time: 4.63437 ms Total execution time: 5.29936 ms
- N = 5000000
Memory usage at before allocation: used = 105.000000, free = 14825.562500 MB, total = 14930.562500 MB Memory usage at after allocation: used = 205.000000, free = 14725.562500 MB, total = 14930.562500 MB * Point generation time: 1.76397 ms * Spherical transformation time: 1.72032 ms * Copying to host time: 20.9988 ms Total execution time: 24.483 ms * Point generation time: 1.7425 ms * Spherical transformation time: 1.67654 ms * Copying to host time: 20.9689 ms Total execution time: 24.388 ms * Point generation time: 1.6937 ms * Spherical transformation time: 1.62406 ms * Copying to host time: 21.2419 ms Total execution time: 24.5596 ms
- N = 7000000
Memory usage at before allocation: used = 105.000000, free = 14825.562500 MB, total = 14930.562500 MB Memory usage at after allocation: used = 243.000000, free = 14687.562500 MB, total = 14930.562500 MB * Point generation time: 2.51101 ms * Spherical transformation time: 2.38698 ms * Copying to host time: 29.7932 ms Total execution time: 34.6912 ms * Point generation time: 2.48816 ms * Spherical transformation time: 2.34291 ms * Copying to host time: 29.6979 ms Total execution time: 34.5289 ms * Point generation time: 2.49011 ms * Spherical transformation time: 2.34176 ms * Copying to host time: 29.7214 ms Total execution time: 34.5533 ms
- N = 9000000
Memory usage at before allocation: used = 105.000000, free = 14825.562500 MB, total = 14930.562500 MB Memory usage at after allocation: used = 281.000000, free = 14649.562500 MB, total = 14930.562500 MB * Point generation time: 3.10112 ms * Spherical transformation time: 2.92096 ms * Copying to host time: 37.5393 ms Total execution time: 43.5613 ms * Point generation time: 3.07869 ms * Spherical transformation time: 2.87117 ms * Copying to host time: 37.7315 ms Total execution time: 43.6814 ms * Point generation time: 3.08115 ms * Spherical transformation time: 2.86979 ms * Copying to host time: 37.6602 ms Total execution time: 43.6111 ms
- N = 10000000
Program terminated with signal: SIGKILL
- ์ฒ๋ง๊ฐ๋ godbolt์์ ์คํ์ ์ํด์ค๋คโฆ ใ
- N = 1000
-
์ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋ฆฌ๋ฉด (3ํ๋ค์ ํ๊ท ๊ฐ):
- ์ด ์คํ์ ํตํด ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์๊ณ ์๋ ์ฌ์ค์ ๋ค์ (godbolt ๋๋ถ์) ๋น ๋ฅด๊ฒ ์์๋ณผ ์ ์์๋ค.
- GPU๋ ๋ณ๋ ฌ ์์
์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ค.
- task๋ง๋ค ๋ค๋ฅด๊ฒ ์ง๋ง, 900๋ง ํฌ์ธํธ๋ฅผ 3d์์ 2d (spherical image)๋ก projectionํ๋ ์ฐ์ฐ์ด T4์์ 3ms ์ ๋ ์์๋์๋ค.
- thrust ์ API๋ฅผ ์ด์ฉํ๋ฉด ์ด๋ฌํ ์ด๋์ ํ๋ก๊ทธ๋๋จธ ์ ์ฅ์์ ์์ฃผ ์์ฝ๊ฒ ์ทจํ ์ ์๋ค.
- CPU์ GPU์ฌ์ด copy๋ ๋งค์ฐ ๋๋ฆฌ๋ค.
- ps. ์์ฆ ๊ทธ๋์ HBM์ด๋ผ๋ ๋จ์ด๋ ํซํ ๋ฏ ํ๋ค.
- ์์ ์์์์๋ input point cloud ๋ฅผ random ํ๊ฒ ์์ฑํ๋ ๊ฒ๋ device-side ์์
thrust::transform
์ ํตํด์ ์ํํ์ฌ์ ์ญ์ ์๊ฐ ์์๊ฐ ๋งค์ฐ ์ ์๋ค.
- GPU๋ ๋ณ๋ ฌ ์์
์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ค.
- ์ด ์คํ์ ํตํด ์ฐ๋ฆฌ๋ ์ด๋ฏธ ์๊ณ ์๋ ์ฌ์ค์ ๋ค์ (godbolt ๋๋ถ์) ๋น ๋ฅด๊ฒ ์์๋ณผ ์ ์์๋ค.
๊ฒฐ๋ก
- godbolt ๋ ์์ฃผ ์ข์ ์ฌ์ดํธ์ด๋ค.
- share ๋ ๊ฐ๋ฅํ๋ค. ๊ต์ก์ฉ์ผ๋ก ์์ฃผ ์ข์.
- godbolt cppcon ๋ผ๊ณ ์ ํ๋ธ์์ ๊ฒ์ํ๋ฉด Matt Godbolt ์ ์๋์ ์์ฃผ ์ข์ ๊ฐ์๋ค์ด ๋ ๋ง์ด ์๋ค.
- share ๋ ๊ฐ๋ฅํ๋ค. ๊ต์ก์ฉ์ผ๋ก ์์ฃผ ์ข์.
- thrust ์ค์ต์ ์ด์ด๋๊ฐ๋ณด์.