CUDA kernel이 어떤 종류의 device에서도 올바르게 동작할 수 있지만, 수행 속에서도 각 device의 제약에따라 크게 다를 수 있다. 본 단원에서는 CUDA device의 주요 제약을 논하고 어떤 해결방법이 있는지 알아본다. thread 수행 kernel이 수행되면 두 수준 계층으로 구성되는 thread들의 집합인 grid가 생성된다. grid는 1,2차원 배열들의 block으로 구성되며, block은 1,2,3차원 배열들의 thread로 구성되었다. 한 block은 다른 block과 상관없이 어떤 순서로든 수행할 수 있어 CUDA의 투명확장성을 가능하게 한다. block내 thread들도 서로 상관없이 어떤 순서로도 수행될 수 있다.(순서에 상관이 있다면 barrier동기화) cuda de..
병렬성의 제한적인 메모리 CUDA의 register, shared memory가 global memory access횟수를 줄이는데 효과적이라 해도 memory용량을 초과하지 않아야한다. 각 CUDA device는 제한된 크기의 CUDA memory를 제공하기 때문에 응용 프로그램이 주어질때 SM들이 동시에 수행되는 thread개수도 줄어든다. 각 thread가 더 많은 memory를 요구할수록 각 SM에 상주할 수 있는 thread개수도 줄어든다. 예를들어 각 SM이 8k(8192)개의 register를 가지고있는데, 전체 프로세서에 대해서는 총 128k개의 register가 있다. 이는 매우 큰 수이지만 개별 thread로 보면 하나의 thread는 매우 제한적인 개수의 register만 사용할 수 ..
thread들에 의해 수행되는 data들은 일단 host memory로부터 device의 global memory로 옮겨진다. 그리고 나서 thread들은 자신의 blockIdx와 threadIdx를 사용해 data중 자신이 처리해야하는 부분을 접근한다. => 이런 간단한 cuda kernel로는 hardware의 잠재적인 최대성능을 아주 일부분만 얻을 수 있다. DRAM으로 구현된 global memory의 접근 지연시간이 매우 길고 접근 대역폭도 제한적이기 때문이다. gobal memory로의 접근이 지나치게 많아져 data flow가 정체되는 상황이 발생할 수 있다. 즉, SM들 중 일부는 놀고 있을 수 있다. cuda에서는 memory접근을 위한 추가적인 방법을 제공하고있다. (cuda kerne..
Cuda kernel 함수를 개시하면, kernel function을 수행하는 thread들이 grid를 형성한다. kernel 함수는 program 실행 중 kernel이 개시될때 생성되는 thread들이 수행할 C문장을 정의한 것이다. grid내부의 thread들의 구성과 자원할당, 스케줄링을 살펴본다. CUDA thread의 구성 - grid내부 thread들은 모두 동일한 kernel fuction을 실행하기에 서로 구별하고 사용할 data영역을 구별하기 위해 고유한 좌표값(blockIdx, threadIdx)를 사용한다. - blockIdx, threadIdx는 kernel 함수에서 사용할 수 있도록 이미 초기화된 변수로 주어진다. 즉, thread가 kernel 함수를 수행하는 도중 blcok..
GPU는 많은 양의 연산을 병렬처할 수 있으며, 이를 지원하기위해 CUDA라는 GPU programming으르 통해 효율적인 연산 병렬화를 지원한다. 행렬 곱셈의 예) 행렬 P의 각 원소는 M의 행과 N의 열의 내적연산의 결과이다. 이 과정에서 P의 서로 다른 원소를 얻기위해 내적을 동시에 실행할 수 있다(data 계산의 병렬성). 이 원리를 통해 CUDA device(GPU)는 CPU보다 더 빨리 연산이 가능하다. pitfall! "GPU가 CPU에 비해 연산이 더 빠르다고 CPU가 필요없는 것은 아니다. " CPU와 GPU는 사용목적과 배경에 따라 서로 다르게 발전했다. GPU는 CPU보다 훨씬 많은 양의 ALU를 보유하고 있어 병렬연산에 용이하지만, 현재까지 CPU(host)없이 GPU는 구동할 수..