Recent posts
-
C++,CUDA
[CUDA] Reduction 커널과 최적화 기법: Warp Divergence 현상과 Sequential Addressing, Warp Shuffle 기법
해당 포스팅은 AI와 NVIDIA에서 공식적으로 게시하는 문서인 CUDA Programming Guide 문헌을 기반으로 만들어졌음을 알립니다. 개인적으로 최대한 엄밀하게 검증을 거쳤으며 혹여나 잘못된 내용이 있다고 판단되면 적극 피드백 부탁드립니다. 이번 포스팅에서는 그동안 배웠던 커널 종류와는 다른 종류인 Reduction 커널에 대해서 알아보고, 이 Reducion 커널도 단계적으로 최적화해나가는 방식들인 Sequential Addressing, Warp Shuffle에 대해서 알아보도록 하자.1. Thread들이 수행한 결과물을 서로 공유한다: Reduction 커널Reduction 커널이란 무엇을 의미할까? 그에 앞서 우리가 지금까지 배워온 다양한 최적화 기법들은 모두 2개의 2차원 벡터라는 행..
-
C++,CUDA
[CUDA] 1개의 쓰레드가 여러 개의 원소를 생성하자: Register Tiling
해당 포스팅은 AI와 NVIDIA에서 공식적으로 게시하는 문서인 CUDA Programming Guide 문헌을 기반으로 만들어졌음을 알립니다. 개인적으로 최대한 엄밀하게 검증을 거쳤으며 혹여나 잘못된 내용이 있다고 판단되면 적극 피드백 부탁드립니다. 이번 포스팅에서는 Register Tiling 이라는 기법에 대해서 알아본다. Register Tiling 기법이 기존에 배웠던 Shared Memory 기반의 Tiling 기법의 어떤 지점을 해결하고 어떤 식으로 동작하는지 개념적인 부분을 이해해보도록 하자. 그리고 마지막에 이를 구현한 CUDA 코드도 첨부했다.1. Shared Memory Tiling의 한계: 여전히 데이터를 중복 조회한다이전 포스팅에서 배운 Shared Memory 기반의 Tiling..
-
C++,CUDA
[CUDA] 메모리 Port 와 Bank, 그리고 Bank Conflict 현상
해당 포스팅은 AI와 NVIDIA에서 공식적으로 게시하는 문서인 CUDA Programming Guide 문헌을 기반으로 만들어졌음을 알립니다. 개인적으로 최대한 엄밀하게 검증을 거쳤으며 혹여나 잘못된 내용이 있다고 판단되면 적극 피드백 부탁드립니다. 직전 포스팅에서 Shared Memory 기반의 Tiling 기법에 대한 매커니즘을 이해함으로써 커널에서 Global Memory로 매번 조회하지 않고 Shared Memory를 매번 재사용하면서 메모리의 접근 횟수를 줄이고 이에 따라 커널의 FLOPs/byte 지표를 향상시킬 수 있는 방법에 대해 배웠다. 이번 포스팅에서는 다른 측면에서의 최적화를 해볼 수 있는 Banking 이라는 기법에 대해 알아보고 이와 관련된 Banking Conflict 라는 현..
-
C++,CUDA
[CUDA] 데이터를 가져올 때 사용하는 메모리: Global/Shared Memory, 그리고 Tiling 기법
해당 포스팅은 AI와 NVIDIA에서 공식적으로 게시하는 문서인 CUDA Programming Guide 문헌을 기반으로 만들어졌음을 알립니다. 개인적으로 최대한 엄밀하게 검증을 거쳤으며 혹여나 잘못된 내용이 있다라고 판단되면 적극 피드백 부탁드립니다. 이번 포스팅에서는 저번 포스팅에서 살펴본 두 2차원 행렬의 곱 연산을 수행하는 커널 함수의 문제점을 파악해보면서 배우게 되는 Global Memory, Shared Memory, 그리고 Tiling 기법에 대해서 알아보도록 하자.1. 장치의 성능을 측정하는 지표 - FLOPs/byteCPU, GPU와 같은 하드웨어 장치의 성능을 측정하기 위한 다양한 지표들이 있다. 이 지표들을 Arithmetic Intensity(a.k.a AI) 라고도 부르는데, 우리..
-
C++,CUDA
[CUDA] 2차원 행렬 곱 연산을 CUDA로 프로그래밍 해보자!
해당 포스팅은 AI와 NVIDIA에서 공식적으로 게시하는 문서인 CUDA Programming Guide 문헌을 기반으로 만들어졌음을 알립니다. 개인적으로 최대한 엄밀하게 검증을 거쳤으며 혹여나 잘못된 내용이 있다라고 판단되면 적극 피드백 부탁드립니다. 이번 포스팅에서는 그동안 다루었던 1차원 벡터가 아닌 2차원 벡터 즉, 행렬을 이용한 곱 연산(matmul)을 CUDA로 프로그래밍해보도록 하자.1. 쓰레드 수와 블록 수를 2차원으로 확장하자!가장 먼저 해야할 것은 두 2차원 벡터의 행렬 곱 연산을 하기 위해 디바이스 장치에서 다음과 같은 2가지 종류의 하드웨어 관련된 설정 값을 지정해주어야 한다. 첫번째는 1개의 블록 당 몇 개의 쓰레드들로 구성할지이다. 두번째는 하나의 커널 당 만들어지는 단위인 그..