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는 구동할 수..
Introduce DRAM 디바이스는 각각의 디바이스의 데이터 비트 수에 따라 분류할 수 있고, 세대가 바뀔 때마다 4배씩 증가하였습니다. 주어진 세대에서 DRAM 디바이스는 다른 어플리케이션에 사용되는 다른 데이터 버스 넓이에 의해 구분됩니다. 다음 표는 256M 비트 디바이스의 3가지 구분을 보여줍니다. (4비트 데이터 버스, 8비트 데이터 버스, 16비트 데이터 버스로 구분될 수 있다는 것을 보여줍니다. 4비트 데이터 버스에서 데이터 1개의 column을 가져오기 위해 SDRM 디바이스에 공급되는 어드레스는 4비트의 데이터를 받고, 디바이스에는 4비트 데이터와 함께 6천4백만개의 분리된 어드레스 가능한 장소가 있습니다. 그러므로 4비트 데이터 버스를 가지는 256M비트 SDRAM디바이스는 64Meg..
Introduce 모든 DRAM 디바이스들은 DRAM 디바이스의 데이터의 onto, within, off이동을 지시하는 몇몇 기본적인 로직 컨트롤 회로를 가집니다. 필수적으로 몇몇 컨트롤 로직은 DRAM 디바이스상에 있어야 하며, 외부에 인가된 시그널을 받아들이고 컨트롤한 다음에 데이터의 이동을 지시하는 내부 컨트롤 시그널의 타이밍 시퀀스를 적절히 조율하는 역할을 합니다. 위는 FDM DRAM디바이스에서 데이터의 이동과 감지를 위한 시그널의 타이밍과 순서를 컨트롤하고 만들어내는 컨트롤 로직을 보여줍니다. FDM DRAM의 컨트롤 로직은 비동기로 외부의 컨트롤 시그널을 받아들이고, 내부의 컨트롤 시그널의 순서를 만들어냅니다. 필수적으로 3가지 시그널을 포함하는데, RAS, CAS, WE입니다. FDM DR..
Introduce 최근의 DRAM디바이스는 제조상에서 복잡한 반도체 공정에 의존하는데, 실리콘 웨이퍼 상의 결함이나 작은 공정 변화는 직접적으로 결함이 있는 셀, 워드라인, 비트라인 등으로 이어집니다. 몇몇 결함들을 견뎌내고 수율을 높이기 위해 선택한 방법은 여분의 로우와 칼럼을 사용하는 것입니다. 밑은 여분의 워드라인과 여분의 비트라인의 어레이를 보여줍니다. DRAM 디바이스에서 DRAM 어레이의 각각의 row는 laser programmable link를 통해 선택적으로 끊을 수 있도록 디코더에 연결되어 있습니다. 셀이나 전체 워드라인에 결함이 있다고 발견하면, 그 로우의 기본 디코더상의 레이저 혹은 전기적인 프로그래머블 링크는 그 기본 디코더에 연결되어 있는 워드라인을 끊고, 여분의 로우가 끊어진 ..
Introduce 오픈비트라인 구조와 폴리드 비트라인 구조와 같은 2개의 서로 다른 어레이 구조를 만듭니다. 이 2가지 어레이 구조의 차이점은 오픈 비트라인 구조 같은 경우 각각의 sense amplifier를 쓰는 비트라인 쌍이 분리된 어레 부분에 형성되어 있는 반면 폴리드 비트라인 구조의 경우 비트라인 쌍이 같은 어레이 부분에서 형성됩니다. 이러한 다른 구조들은 셀 사이즈와 ㄴ노이즈 여유도 측면에서 서로 다른 장단점을 가집니다. 오픈 비트라인 어레이 구조 위 그림은 오픈 비트라인 DRAM 어레이 구조의 개략적인 배치를 보여줍니다. 이 구조에서 셀들이 서로 빽빽이 들어차 있을 수 있습니다. 이 구조는 몇가지 단점을 가지는데, 그 중 하나는 오픈 비트라인 구조는 비트라인 쌍이 다른 어레이 부분에서 오고,..
Introduce 이 장에서는 Fast Page Mode(FDM) DRAM 디바이스에 대한 가벼운 개요를 제공합니다. DRAM 디바이스 조직 위 그림은 FDM DRAM 디바이스의 DRAM 저장 셀들은 4096개의 row, 1024개의 column 그리고 column당 16비트의 데이터로 구성됩니다. 이 디바이스에서 매번 row access가 일어날때, 12비트 어드레스가 어드레스 버스에 인가되고 RAS(Row-Address-Strobe)가 외부 메모리 컨트롤러에의해 실행됩니다. DRAM디바이스 내에서 어드레스 버스에 있는 어드레스는 row address buffer에 의해 buffer되고 그 다음 row decoder로 보내집니다. 그 다음에 4096개 row의 저장 셀들 중 1개를 선택합니다. 그런 다..