23-09

Sandy·2024년 3월 6일

[Today I Learned]

목록 보기
9/18

230902_PhongShading

glm::Length()

벡터 길이 구하기

Ray

각 픽셀에서 z축 방향으로 쏜다 (0, 0, 1)

traceRay()

vec3를 반환한다

광선이 물체에 닿으면 그 물체의 색 반환

IntersectRayCollision()

구-직선의 방정식으로 처리

Hit

광선-충돌지점 거리 + 충돌 위치 + 충돌 위치에서 normal

Ambient + Diffuse + Specular

모든방향 빛 + 반사된 기본 색깔 빛 + 반짝이기

230904_CPU

ALU (Arithmetic Logic Unit)

and or xor 계산하는 회로

A integer Operand + B integer Operand + Status + Opcode

→ Integer Result + Status

Full Adder

4개 붙히면 4bit 계산 가능

Status Register (Flag, Condition Code)

연산 결과 / CPU 상태에 대한 부가 정보 저장하는 레지스터

status flag bits

Program Counter

메모리에서 가져올 명령어 주소를 저장하는 레지스터

범용 Register

데이터와 주소 모두 저장할 수 있는 레지스터

Arithmetic Shift

right 하면 MSB는 유지 → 부호 유지

1111 (-1)

MSB / LSB

Most Significant Bit / Least Significant Bit

이진수 음수

1101 → 10011(X) 0011(O)

And Or Latch

비트 상태 유지하기

Data IN + Write Enable → Data Out

64개 64bit Register

Latch Matrix

주소 표현 가능

row + column

64bit Register

메모리 주소 표현 가능 용량 (하드웨어)

CRT가 leak 잡는 방법

crt 메모리 다 잡고 있고 해제 안 한 것만 리포팅

전역 변수 릭 아닌데 릭으로 보고 메모리 해제 안해서

CRT

C RunTime Library

leak

가상 메모리 부족

Virtual Memory

OS가 한다

당장 필요한 만큼만 프로세스에게 제공

OS (Operating System)

여러 프로세스 바꾸면서 CPU 쓰게 해주기

Process / Main Memory / File / Disk / IO / Etc

Kernel

프로세스로 돌고있다

메모리에 유저영역 / 커널 영역 분리

PID 4번

Shift Register

data storage / movement / conversion / counters

Endianness

Big : 숫자 순서대로 Small : 숫자 반대로 메모리에 저장

PCB (Process Control Block)

프로세스의 상태를 저장하는 자료 구조

230905_Rendering

Frame buffer

화면에 보여지는 메모리

Fixed Pipeline

데이터 쭉 통과해서 결과물 나온다

Programmable Pipeline

vertex + pixel

world view projection

상수 레지스터에 넣어둔다 constant buffer

constant buffer

light 정보 N * L

Deferred Rendering

출력 레지스터 백 버퍼 여러개

렌더 타겟 여러 개 만들어서 한번에 그릴 수 있게 한다

정보들을 렌더 타겟에다가 넣어두고 한번에 조합해서 그린다

Defferred Rendering vs Forward Rendering

defferred : 여러 lighting 연산 한번에 수행, G buffer 커진다

forward : 기존 렌더링 방식, 파이프라인 쭉 따라가서 최종 이미지 생성

RenderTarget

Object Pass 렌더 타겟에 그림 그리기

Shading Pass : 각 픽셀의 색 계산

Forward Rendering

기존 렌더링 방식

Render Target

렌더링 결과를 저장하는 버퍼

Normal Map

물체의 normal 정보를 저장하는 render target

Pos Map

위치 정보를 저장하는 render target

GPU HAL

Hardware Abstraction Layer

GPU 에 대한 인터페이스 제공

skinning (vertex weighting, mesh deformation)

3D 메시의 관절을 자연스럽게 만들기

vertex의 weight를 조절한다

Bone based animation

hierarchical 구조로 본을 세팅한다

IK (Inverse Kinematics)

end effector에 따라서 관절에서 가중치에 따라 어떻게 움직이는지 설정

230906_MoveSemantic

Resource Acquisition Is Initialization

Exception-Safe Resource Management

Constructor Acquires Destructor Releases

Scope-Based Resource Management

멀티 쓰레드 락 걸기 / 파일 입출력하기 / 스마트 포인터

Scope-Based Resource Management

unique_ptr / shared_ptr

Renderer 그냥 포인터 갖는 것보다 unique_ptr 가지면 delete 관리 안해도 된다

Container

데이터를 담아두는 방식이다

constexpr

#define(X) macro(X)

컴파일 시간 상수 값 정의

compile time 에 실행할 수 있는 expression이다

Expression

operator + operands

auto

타입이 너무 길어지면 보기 편하게 auto로 해놓는다

헷갈리지 않을 곳에만 잘 써야 한다

{} Initializer List

컨테이너는 list constructor를 갖는다

lnitializer list로 초기화를 한다

move semantic

얕은 복사 후 원본의 reference 제거

메모리 생성, 복사(X) 메모리 주소 복사(O)

임시객체 : 깊은 복사(X), 주소만 복사, 기존 참조 없애기

Lambda

function pointer(X)

함수 오브젝트 생성할 때 inline lambda

230907_cast

static_cast

upcast : (O)

runtime 체크 안한다

reinterpret_cast

포인터끼리 변환

비트변환

volatile

프로그래밍한대로 메모리 동작하도록 하기 컴파일러 최적화(X)

const, volatile 비슷하게 처리 된다

typeid

런타임에 개체의 형식 확인

모든 컴파일러가 동일하게 string 저장하지 않아서 dll 쓸 때 주의해야한다

포인터 찍어보면 포인터 나오는데 ref 찍으면 안나온다

포인터는 변수 표현식

reference는 변수에 대한 참조이고, 타입이 아니다

230911_커널 오브젝트

커널

프로세스에게 하드웨어 자원을 나누어준다

시스템 콜 한다

커널 - 어플리케이션 사이 프로그램

window 탐색기(작업표시줄, 시작, 파일탐색기)

Powershell

Windows NT

windows shell / windows API / Hardware Abstraction Layer

프로세서 64bit

데이터를 다루는 단위가 64bit

64bit → 8byte → double 사용 가능

운영체제 64bit

18.4TB RAM

응용 프로그램 64bit

프로세서와 운영체제가 둘 다 64비트 지원하면 위에서 동작한다

virtual memory

프로세스마다 쓰는 주소를 관리하기 위해서

커널 오브젝트

커널이 다루는 모든 것

프로세스 (커널 오브젝트)

프로세스가 커널 오브젝트이다 OS가 관리하는 오브젝트

커널 오브젝트 : 프로세스를 관리하기 위해 운영체제가 사용

주소공간 : 실행 모듈 / DLL의 코드나 데이터 갖고있는 주소 공간

프로세스의 커널 오브젝트

프로세스가 소유한 커널 오브젝트

하나의 프로세스가 생성한 커널 오브젝트

프로세스에서 커널 오브젝트를 생성하면 커널 오브젝트 핸들 테이블이 채워진다

CloseHandle() → HandleCount --

프로세스 사이의 커널 오브젝트

부모→자식으로 상속

DuplicateHandle

멀티코어에서 멀티프로세싱을 해야 할 때 스케쥴링

하나의 cpu에서 멀티태스킹은 라운드 로빈 방식이 적절

non preemptive : 우선순위대로 한다 설정한 값 + 걸린 시간

preemptive를 기본으로 쓴다

가상주소 공간

모든 프로세스는 자신만의 가상주소공간 가진다 → 개별 프로세스 메모리에 대한 독립성

64비트 프로세스의 가상 주소 범위

MMU

메모리 관리 장치 : CPU가 메모리에 접근하는 것을 관리하는 하드웨어 부품

230912_Normal

Normal

vertex에 수직인 벡터

Vertex

메시를 이루는 점들

matViewProjection

model view projection

Transform matrix

transform을 적용한 행렬

월드 공간으로 변화시키는 각 오브젝트의 변환 행렬

HDR High Dynamic Range

연산에서는 실수 값 쓴다

어두운 곳과 밝은 곳 대비 늘린다

Normal Mapping

텍스쳐 자체에 노말 벡터를 rgb로 넣어 놓았다

Normal Transform Matrix

각 버텍스의 노말에 어떤 값 곱했을 때 왜 scale 아니라 부풀고 줄어들까

역 전치행렬 써야 노말이 안 뒤틀린다

각 버텍스의 수직 방향

Tangent Space == Vertex Space == TBN Space == TBN Matrix

Tangent + BiTangent + Normal

버텍스 하나마다 공간을 갖고있다

노말 매핑을 할 때 필요하다

swap(int& a, int& b)

int tmp = a;

a = b;

b = tmp;

swap(a, b);

swap(int pa, int pb)

int tmp = *pa;

pa = pb;

*pb = tmp;

swap(pa, pb)

Update() Object 각 프레임마다 업데이트 할 때 각자 어떻게 동작할지

Object 상속한 Player, Monster 에서 씬의 객체를 업데이트 할 때 사용한다

객체에 브레이크 포인트를 찍어서 확인하면 __vptr이 있다

각 객체에 클래스에 따라 virtual로 선언하면 어떤 함수를 사용할지 결정할 수 있다

__vptr에는 함수에 대한 포인터가 들어있다

auto

변수의 자료형을 컴파일 시간에 자동으로 추론

런타임 X 컴파일 O

const int& a = 0;

auto a2 = a;

typeid

런타임에 타입 알려준다

const / ref 붙었을 때

auto / typeid 못 쓴다

const auto& a = b;

auto&&

lvalue → lvalue

rvalue → rvalue

std::move()

rvalue로 바꿔준다

230918_align()

typeid / decltype

typeid : 런타임

decltype : 컴파일 → 템플릿 사용 가능

#pragma pack(1)

struct 불필요한 데이터 제거

아니면 Serialize 쓴다

Serialize

메모리 상에 연속적으로 저장하기

align()

데이터 정렬해서 넣기

SIMD

병렬로 계산

Virtual Function Table

컴파일 타임에 생성

각각의 객체가 테이블을 참조 : this pointer

template

컴파일 타임에 생성

230919_BlinnPhong Light

BlinnPhong Light

reflection과 view 방향이 90도 이상 → 0이다

Blinn : Specular - half angle vector

Phong : per pixel light

Half Angle Vector

H = L + V / abs(L + V)

Light Position과 View Vector의 중간이다

230920_SIMD

4x4 matrix SIMD

16byte

GPU에서 벡터 연산으로 변환을 처리해야 한다. → 하나의 동일한 명령으로 여러 데이터 처리

align(16)

메모리에 연속적으로 저장한다

230922_constexpr

Alias

typedef (X) using (O)

constexpr

템플릿 쓰려면 컴파일 시간에 알아야 한다 → const(X)

컴파일시간에 값 변경 안하게 상수로 확정한다

230923_컴파일러

Constant Propagation

상수값이면 쭉 상수값으로 바꾸어 놓기

Constant Folding

상수 계산식 미리 계산해서 상수 값으로 바꾸어 놓기

Dead-code Elimination

사용 안되고 실행 안되는 코드 제거하기

Loop Fission

반복 구문을 나눈다 → 캐시 HIT 올린다

Temporal Locality

같은 데이터 짧은 시간에 여러 번 접근한다

Spatial Locality

벡터 순회 할 때 주변 데이터 갖고온다

Loop 반복 구문

arr[i][j] 돌 때 j가 안에 있다 → spatial locality

Loop 반복 구문 순서 뒤집기

strlen() for문 안에 있으면 계속 구한다 → i = strlen()로 한번만 구한다

Loop 반복 구문 펼치기

분기 처리 줄인다 → 명령어 파이프라인에서 동시에 실행될 수 있도록 한다

분기 예측

if 문 자주 쓰는 것으로..?

inline 화

함수를 코드로 바꾼다 → 함수 호출 비용 감소, 추가적인 컴파일 단계 최적화 가능

RVO, NRVO(Return Value Optimization)

객체를 직접 할당한 메모리에 넣기 → 함수 내부에 반환값으로 리턴되는 객체에 대해 할당을 위해 복사생성 (X)

ABI(Application Binary Interface)

운영체제에서 실행되는 프로그램들이 따라야 하는 포맷

기계어 수준에서 사용을 위한 인터페이스

함수를 어셈블리 코드로 변환하는 방법을 표준화한다

CPU OS에 따라 다르다

Symbol Information (심볼 정보)

함수 필요하니까 나중에 넣어줘 에 대한 정보

Name Mangling

오버로딩에서 심볼 정보 만들 때 이름이 겹친다 → 추가적인 값 붙히기

PDB (Program Database)

디버깅을 위해서 심볼 값 저장

230925_Command Pipeline

__vptr / VTable

__vptr : pointer, constructor가 만든다

VTable : virtual function이 저장된 table, 컴파일러가 만든다

Thread

모든 프로세스는 주 스레드가 존재한다

스레드 별로 Thread Context Block 이 있다

병렬성 Pararell

CPU 자체 물리적인 동작 HW

동시성 Concurency

동시에 작동하는 것처럼 보인다 SW

CISC / RISC

명령어 집합

CISC : complex 인텔 기본적 사용 x86, 회로 복잡 → 발열

RISC : 길이 일정, 서버용 CPU

CPU 게이트

조건 분기, 예외 발생 해야 파이프 라인 성능 잘 나온다

파이프라인 구조의 단점 : 파이프라인의 실행 단계에 가야 그 다음에 들어올 명령어가 틀린지 알 수 있다 → CPU 연산 자체와 상관 없는 메모리 계층에 흔적을 남긴다

커널 권한을 가지지 않은 프로그램에서 커널 메모리를 읽을 수 있다

Command Pipeline

명령어를 하나 처리하고 다음 명령어를 처리하는 방법(X)

명령어를 각 단계별로 나누어서 파이프라인에서 다음 상태로 넘겨주는 방법 (O) → 한 사이클에 여러 명령어 실행 → 병렬성

플린 분류

명령어 + 데이터 처리를 어떻게 하는지 분류한다

SIMD / GPGPU

parallel 처리

simd : CPU, 데이터 수준의 병렬성,

GPGPU : GPU, 병렬 컴퓨팅 플랫폼, OpenCL, CUDA

0개의 댓글