CPU : 복잡한 연산을 빠르게 처리하도록 설계
-> 처리시간을 빠르게 하는 쪽으로 발전
-> 고성능 프로세서 탑제
GPU : 단순하지만 많은 연산을 처리하도록 설계
-> 처리량을 많게 하는 쪽으로 발전
-> 성능이 높지 않은 프로세서 수천개
동영상은 이미지 한장한장을 빠르게 표기해서 움직이는 것 처럼 보임
보통 동영상은 1초에 30장의 이미지 사용
-> 프레임 : 1장의 이미지(2백만개의 픽셀) x 30장 = 1초에 계산할 픽셀 수 약 6천만개
GPU : 모니터에 뿌려질 픽셀의 정보를 계산
픽셀의 정보를 CPU를 이용해서 계산할 수도 있지만 효율적인 방법은 아님
점 -> 선(점과 점 이음) -> 면(선 연결해서 내부를 채움)
폴리곤메쉬 : 정점들을 연결해서 만든 3차원 모델 (폴리곤 - 다각형 / 메쉬 - 그물)
-> 다각형 그물 형태
-> 주로 간단한 형태인 삼각형을 이용해서 그물처럼 서로 연결해 가며 3차원 모델을 만들어 감
-> 삼각형을 만들기 위해 3개의 정점 필요(각각의 정점들은 위치를 표시할 수 있는 좌표값을 가짐) -> 3차원 이기에 x, y, z축 값 필요
-> 노말 : 3차원 모델을 표현하기 위해 각 점들의 수직 방향의 정보(정점이 어느 방향을 향하는지 알기 위한 정보, 일반적으로 3차원 모델의 바깥쪽으로 노말값 표현)
-> 3차원 모델에 색을 입혀주기 위해 각 정점의 이미지에 대한 정보 필요
정점데이터를 GPU에 입력하면 입력받은 정보에 대해 연산 수행
-> 정점데이터는 GPU 프로그램에 의해 삼각형으로 만들어 짐(삼각형생성)
-> 결국 모니터에는 픽셀로 표시 필요
-> 삼각형을 픽셀로 채워주기 위해 픽셀의 구역을 나눠줌(조각화)
--> 만들어진 예비 픽셀을 프래그먼트, 노말값의 평균을 이용해 조각들의 노말값도 계산
-> 조각들의 색을 입혀주기 위해 이미지에 대한 정보를 조각들 마다 계산(픽셀화)
-> 빛을 이용한 명암의 차이 표현(이미지화)
--> 깊이정보를 이용해서 뒤에 있는 물체가 가리게 되면 그 픽셀은 표현되지 않도록 계산해줌
-> 프래그먼트 정보들은 최종 픽셀로 만들어지고 모니터에 표현
--> 3차원 정보라해도 모니터는 2차원 정보기 때문에 해당 과정이 필요함
정점데이터 : 정점의 위치, 노말, 이미지 좌표, 깊이에 대한 정보 등 많은 정보 포함
3차원 데이터 : 움직이거나 위치 변경 -> 변하는 정점의 데이터를 계속해서 계산해줘야함
-> 행렬의 곱셈 형태로 진행
수십만개의 정점데이터를 행렬의 곱셈으로 실시간 계산하고 모니터에 뿌려줄 픽셀을 만들어 줘야 하는것이 GPU의 역할
하나의 프래그먼트는 코어 안에 있는 산술논리장치(ALU)에서 처리됨
-> 두개의 코어를 사용하면 두개의 프래그먼트가 동시에 계산됨
-> 코어가 많아질수록 동시에 처리되는 프래그먼트가 많아짐
-> SIMD라 할 수 있음
SIMD(Single Instruction Multiple Data) : 하나의 명령어로 여러개의 데이터를 얻는 방식
-> 프래그먼트 뿐만 아닌 픽셀을 만들기 위한 모든 연산은 해당 방식으로 처리
정점이나 프래그먼트 프래그먼트 계산들은 순차적이 아닌 서로 독립적으로 계산됨
-> GPU는 순차적 연산에 효율적이지 못함
-> 하나의 결과값을 기다렸다가 다음 결과값을 기다려야 하기에 효율이 떨어짐
-> 서로 독립적인 연산을 처리하는것이 효율적
ex) A+B = C, C+1 = D => C를 먼저 구해야 계산하는 것(순차)
이러한 GPU 특성을 활용하여 대량의 데이터를 처리하고자 하는 욕구가 생김
-> 그래픽 처리를 목적으로 만들어졌기 때문에, 데이터의 형식을 그래픽이 처리되는 형태(행렬곱)으로 만들어야 하는 번거로움 발생
-> 불편함을 해소하고자 CUDA-nVidia 사에서 제공하는 GPU 프로그램 /OpenCL 등의 프로그램 개발됨
CUDA 코어와 프로그램 데이터 처리하는 방식
-> 현재 GPU에 들어있는 코어의 수는 몇천개의 불과(수백만개의 스레드를 SIMD로 처리 할 수 없음)
-> GPU는 SIMT(Single Instruction Multiple Threading) 방식으로 작업 처리
--> 쓰레드 중심 처리 방식
--> 쓰레드를 그룹화하고, 코어를 그룹화하여 배분
--> warp : 그룹화 한 쓰레드를 작게 다시 그룹화 한 것(하나의 스레드가 각각 하나의 코어에 할당) -> 하나의 워프안에 들어있는 스레드들은 마치 하나의 작업처럼 처리됨
지연시간 : 코어가 연산을 수행하다가 메모리로부터 데이터를 얻어오기 위해 잠시 대기하는 시간
-> CPU의 경우 최소한으로 줄이기 위해 코어 근처에 캐시메모리를 만드는 방식
-> GPU의 경우 지연시간이 발생하면 다음 warp를 수행함 (지연시간이 발생하지 않고 계속해서 연산이 이루어짐) --> 지연시간을 없게 하려면 스레드가 많이 있어야 효율이 좋음
GPU는 대량의 데이터를 병렬 처리하는데 있어 효율이 좋다
딥러닝 : 신경세포를 흉내 낸 신경망 네트워크 사용
-> 많은 데이터가 입력되고 연산되어 결과 값을 도출해내는 형태
-> 곱하기와 더하기 반복하는 구조
-> 많은 양의 데이터를 이용한 단순 계산이므로 GPU 활용하면 효과적
비트코인 채굴방식 : 정해진 해시값이 나올때까지 임의의 숫자를 계속해서 더하는 방식
-> 순차적 진행 필요 x, 더하기를 반복하는 작업 => GPU 사용
날씨예보 : 물, 공기 등 유체의 흐름 계산 -> 특정 지역의 온도, 습도, 공기의 흐름을 격자로 나누어 날씨 변화를 계산
-> 격자를 작게하면 병렬도는 증가해서 더 많은 스레드를 이용한 병렬 계산을 할 수 있음