본문 바로가기

BSMath

(4)
SSE2를 이용한 Vector, Matrix 구축 SSE2? SSE2는 SIMD 명령어 집합 중에 하나로, 2001년에 처음 공개되었다. 그 후에도 SSE3, 4와 AVX 등의 다양한 명령어 집합이 발표되었다. 그중에서 SSE2를 선택한 가장 큰 이유는 128비트 레지스터와 활용에 필요한 명령어가 있고, 거의 모든 컴퓨터가 지원하는 명령어 집합이기 때문이다. 물론 추후 다른 명령어 집합으로 확장할 수 있게끔 구축하였다. 어떻게 구축하였는지 역시 뒤에 설명되어있다. SIMD 명령어와 Vector, Matrix의 분리 가장 중요한 부분이다. SIMD 명령어를 분리하면 추후 다른 명령어 집합으로 확장해도 Vector, Matrix에는 영향을 주지 않게 된다. 또한 SIMD 명령어의 최적화를 위해서는 Load, Store를 최대한 줄이고 적재되어있는 상태에서 ..
현대 컴파일러에서의 inline 함수 inline 키워드는 inlining과 관련이 없다 일단 inline의 정의부터 확실히 하자. inline은 컴파일러에게 해당 함수의 inlining을 요청하는 함수이다. 강요가 아니다. 그렇기에 __forceinline 등의 inlining을 강요하는 키워드가 있다. 그러나 요즘의 컴파일러는 똑똑해서 자체적으로 inlining 여부를 판단한다. 즉 inline 키워드는 inlining과 관련이 없다. inline 키워드의 의의 그럼 inline 키워드는 쓸 이유가 없을까? 그건 아니다. inline 키워드는 해당 함수가 ODR을 무시하게 만들어준다. ODR은 One Definition Rule의 약자로, 객체나 함수의 정의는 유일해야한다.라는 규칙이다. 이 때문에 선언은 헤더에, 정의는 cpp 파일에 ..
Random의 객체 기반 설계 객체 기반 Random이 필요한 이유 기존에 사용하던 C언어의 rand(), srand()와 UE4의 Random(Random Stream 제외)은 전역 State 기반 랜덤이다. 그렇기에 어디서 난수를 뽑더라도 그것이 다른 곳에 영향을 미치게 된다. 이는 특히 네트워크 환경에서 난수를 동기화하거나, 멀티 스레드 환경에서 프로젝트를 진행할 때 문제가 된다. 이를 객체 기반으로 하면 해결할 수 있다. 객체의 시드만 맞춰주면 다른 객체에 영향을 주고받지 않으면서 원하는 난수를 얻을 수 있다. 그리고 객체로 하면 Engine과 Distributor를 자유롭게 설정할 수 있다는 장점이 존재한다. 구현 코드와 함께 보도록 하자. 단순히 보면 C++ 11의 random 객체를 wrapping 한 것이긴 하다. T는..
CMake, Google Test, Github Action을 통한 테스트 자동화 테스트의 필요성 BSMath는 Header-Only Library이다. 또한 템플릿이 굉장히 많이 사용되었다. 그렇기에 테스트가 정상적으로 수행되는가 이전에, 테스트 코드가 컴파일이 되는가만 보아도 많은 에러를 고칠 수 있다. 그렇기에 테스트를 프로젝트에 도입하게 되었다. CMake CMake란? CMake는 한마디로 요약하면 Multi-Platform Meta Make이다. 기존의 make를 통해서도 빌드는 가능하지만, 이를 추상화하여 간단하게 빌드 스크립트를 작성할 수 있다. 무엇보다도 CMake는 Windows 환경에서 수행 시 Solution 파일을 생성하는 등 다양한 플랫폼에서 동작한다. 그렇기에 프로젝트의 크기는 작지만, 개발은 Windows에서, 테스트는 Linux 환경에서 수행하는 BSMa..