본문 바로가기

분류 전체보기

(55)
[Vulkan] Descriptor, descriptor set, descriptor layout의 관계 DescriptorDescriptor는 shader가 자원에 접근할 수 있게 해주는 handle이다.Vertex shader에서 view matrix, projection matrix 등이 필요한 상황을 생각해보자.이런 matrix 자원들은 매 frame 바뀌기 때문에vertex position 같은 자원들처럼 vertex buffer(GPU memory)에 복사해놓고 사용하기 부담스럽다.그래서 shader가 알아서 접근하도록 손잡이를 만들어준 개념이다. Descriptor Set복잡하게 생각할 것 없이 그냥descriptor 집합이다.(내가 공부하는 예제 프로그램에서는) 각 frame마다 descriptor set이 1개씩 배정되는데,모든 frame의 descriptor set 전체를 descripto..
[Sourcetree] 처음 로컬 프로젝트를 원격 저장소와 연동하기 1. 로컬에서 프로젝트를 만든다. / 원격 레포지토리를 만든다.2. sourcetree - Create 탭에서 만든 로컬 프로젝트의 경로를 입력하여 생성한다.그러면 로컬 저장소에 .git 폴더가 생긴다.안보이면 터미널에서 ls -al 명령어를 통해서도 확인 가능하다.3. .ignore 를 설정하고 commit 한다.4. sourcetree - 원격(!떠있음) 탭에서 원격 레포지토리 주소를 입력해서 연동해준다.5. push 한다.6. github 사이트를 통해 로컬 프로젝트가 원격 저장소와 잘 연동되어 push 되었음을 확인한다! ㅎㅎ
const 위치에 따른 해석 (Feat. Vulkan API의 복잡한 type!) 변수와 상수의 구분변수 : 선언 이후 값을 계속 바꿀 수 있는 저장 공간상수 : 선언할 때 값을 할당 후, 값을 바꿀 수 없는 저장 공간 (const keyword로 표현)리터럴 : 값 자체   const 위치에 따른 해석const char* : 상수형 char에 대한 ptr. ptr이 가리키는 변수의 값을 바꿀 수 없다.char const * : char에 대한 상수형 ptr. ptr이 다른 char를 가리킬 수 없다.const char const * : 상수형 char에 대한 상수형 ptr. ptr이 다른 char를 가리킬 수 없고, 변수의 값도 바꿀 수 없다.  응용다음 코드는 vulkan api의 VkInstanceCreateInfo 구조체와 구조체 초기화의 일부이다.   ppEnabledExte..
[CUDA] threadID, threadIdx 구분하기 자꾸 자꾸 까먹고 헷갈려하는 개념이다. ㅜㅜ 이번 기회에 머릿속에 박아넣자!! threadID thread block내에서 몇번째 thread인지 (우리반에서의 출석번호) threadIdx thread block내에서 thread의 좌표 1차원 - (x) 2차원 - (x, y) 3차원 - (x, y, z) blockDim.x * blockIdx.x + threadIdx.x (in 1차원 Thread Block) 전체 Grid에서 몇번째 thread인지
Speculative Tomasulo's Algorithm speculative가 아닌 기본 토마슐로 알고리즘부터 간단히 리뷰해보자. stall cycle을 줄이기 위해서 instruction을 dynamic scheduling하는 방식이다. in-order issue 후 out-of-order execution/completion 한다고 기억하면 된다. WAR를 막기위해 issue를 in-order로 해준다. MIPS 5 stage pipeline과 비교하여 달라진 점은 ID이 Issue + Read operands 의 두 단계로 갈라졌다는 것이고, 이때의 Issue가 위에서 언급한 in-order issue의 issue이다. out of order execution을 위해 reservation stations를 활용한다. (register renaming)
Dynamic Branch Prediction Overview Branch prediction은 크게 static과 dynamic으로 나눌 수 있다. static branch prediction의 경우 compile time에 compiler가 해주고, dynamic branch prediction의 경우 runtime에 Hardware가 해준다. 그 중 하드웨어에 의한 dynamic branch prediction에 대해 알아보자. BHT (Branch History Table)을 사용하는데,브랜치가 이전에 take했는지, 안했는지 과거를 기록하여 예측하는 방식이다. taken(T) / not taken(NT) 여부를 몇 비트로 기록할지,모든 브랜치의 과거 기록을 통합하여 기록할지 또는 개별 브랜치의 과거 기록을 기록할지 등에 따라몇가지 종류의 predictor가..
Data Hazard 3가지 - RAW, WAR, WAW 1. RAW (Read After Write) 쓰고 나서 읽어야 해서 생기는 stall cycle들을 말한다. ADD r1, r2, r3 SUB r4, r1, r3 r1 레지스터의 값을 ADD에서 write한 후 SUB에서 사용하는 Dependence 상황에서 발생한다. true dependent라고도 한다. 이러한 상황은 in-order processor처럼 inst의 순서를 바꾸지 않는 프로세서에서도 발생하는 hazard이다. 2. WAR (Write After Read) 읽는 inst과 쓰는 inst이 independent하기 때문에 순서를 바꿔도 되겠구나 했는데, 막상 순서를 바꾸고 나면 문제가 생긴다. 예시를 통해 이해하는 게 좋다. SUB r4, r1, r3 ADD r1, r2, r3 SUB ..
RAID(Redundant Array of Inexpensive Disk) 평가하기 RAID란 Redundant Array of Inexpensive Disks의 약자로, 상대적으로 저렴한 디스크 여러개를 사용하여 하나의 fake logical disk를 구성하는 방식이다. RAID는 capacity, reliability, performance의 3가지 척도로 성능을 평가할 수 있다. 이때 capacity는 "응용이 얼마나 넓은 공간을 사용할 수 있는가?", reliability는 "몇개의 disk의 데이터를 잃어도 문제없는가?", performance는 "각각의 workload에 따른 속도가 어떠한가?"를 의미한다. 아래 예시에서 사용할 기호는 다음과 같다. N = 디스크 개수 C = 디스크 1개의 용량 S = 디스크 1개가 sequential workload를 받을 때의 처리량 (..