이전의 코드 생성은 모두 가정(무한한 레지스터 등)에 의해 리소스를 낭비하였다. 따라서 이를 개선하는 방법이 필요하다. 따라서 memory access의 횟수를 줄여 실행속도를 증가시키고, 쓸모 없는 register의 사용을 줄여 리소스의 낭비 또한 방지한다. 이는 각 레지스터에 가능한 많은 변수를 가지고 있게 하는 방식으로 구현할 수 있다. 이를 위해서 서로 겹치지 않는 live variable을 하나의 레지스터가 공유하여 저장하도록 하면 된다. (덮어씌워도 더이상 사용되지 않는 변수라면 필요 없으므로) 이를 위해서 앞서 진행했던 live variable analysis를 global scope에서 모두 실행한다. 그리고 각 variable을 노드로 가지고, 동시에 존재하는 live variable 사이에 edge가 존재하도록 graph를 그린다. (Register Interference Graph - edge가 존재하는 노드 끼리는 서로 같은 레지스터를 공유하면 안된다) 이 RIG를 통해 연결되지 않은 노드는 같은 레지스터에 할당되어도 문제가 없다는 것을 알 수 있다. 따라서 전체 노드 수보다 적은 레지스터에 모든 변수를 저장할 수 있다. 그리고 TAC로 표현된 각 노드 변수에 서로 연결되지 않았다면 같은 레지스터를 할당하여 어셈브릴 코드를 완성할 수 있다. - k colorable (transform into graph coloring problem) 서로 연결되지 않은 노드에 같은 색을 할당하여 색칠할 때 k개의 색이 필요하다면, k개의 레지스터에 모든 variable을 저장할 수 있다. 따라서 이를 그래프 색칠 문제로 확장하여 이해할 수 있다. 그러나 해당 문제는 NP-hard problem이므로 답은 존재하지만, 효율적으로 풀 수 있는 방법이 없다. (가장 간단한 것이 O(n*2^n)) 따라서 이를 직접적으로 해결하기보다는 heuristic을 사용해야 한다. - Heuristics for graph coloring (not optimal, ...
GRASP(General Responsibility Assignment Software Pattern) 객체지향설계의 9가지 principle. 앞서 identify requirement, domain 모델 등으로 파악한 responsibility를 object들에게 어떻게 할당할 것인지 에 대한 가이드라인. Responsibility 어떤 클래스의 계약이나 의무. - Knowing responsibility : encapsulated data가 어떤 오브젝트/클래스와 연관되어 있는지, 서로 알고 있는 객체/클래스들, 내가 가지고 있는 정보/ 할 수 있는 연산 - Doing responsibility : 어떤 것을 수행(init, control, coordinate activity) 일반적으로 responsibility는 method와 같지 않다. 그러나 메서드들은 해당 클래스의 responsibility를 만족시킬 수 있도록 구현되어야 한다. (여러 메서드의 조합으로 하나의 책임 구현) 설계의 목표 : 시스템을 여러 개의 모듈로 분배하고, 적절한 모듈에 알맞은 책임을 부여하는 것. Modularity가 좋을 수록 프로그래머가 감내해야 하는 복잡도가 낮아진다. 관심사를 분리하고 information을 hiding 하는 것이 모듈화를 잘 진행하는 방법이다. 이를 측정하는 방법은 Coupling과 Cohesion이다. - Coupling(결합도) : 모듈 간의 상호의존성. 어떤 클래스가 다른 여러 클래스들에 의존할 경우 이 값이 커진다. 결합도가 클 경우, 어떤 클래스의 변화가 다른 클래스에 전파되고 영향을 미치기 때문에 좋지 않다. 또한 재사용하기 어려우며 전체 시스템을 이해하기 어려워진다. (하나를 알기 위해 다른 의존적인 클래스를 모두 알아야 하므로) 따라서 이 값은 낮을 수록 좋다. X -> Y : Type X depends on Y. X가 Y의 attribute/method reference를 가지고 있을 경우, X가 Y의 subclass일...
Rendering pipeline : geometry & image as input (which is composed with triangle meshes) -> each vertex operations calculate position (transformations) & color (lighting) (by vertex shades in GPU) -> convert triangles into pixels by rasterization -> do fragment operation for each of pixels (by fragment shader, determine the color of pixel, done by vertex color's interpolation + image texture color) Illuminations - local illumination model(direct light) : only consider the point light source and the object reflecting the light. 그러나 현실에는 다른 곳에서 반사되어 눈에 들어오는 indirect light도 존재하므로 이는 현실을 나타내는 global illumination과는 차이가 있다. 그러나 빠른 계산을 위해 일반적으로 local만 고려한다. 또한 현실에서는 point light source는 존재하지 않으므로 area를 나타내기 위해 여러 point를 합쳐서 사용한다. - shading : determine the intensity of illumination of surface point (위에서 색을 정하는 방법) Approximate simple local illumination model = diffuse + specular + ambient - diffuse component : smooth change of illumination calculated based on Lambert's L...
댓글
댓글 쓰기