Surface Pro X benchmark from the programmer’s point of view.

Windows on ARM I love Windows. Of course, I don’t have much attachment to Windows 3.1 and 95, but I really love Windows after the NT kernel. I also like Windows programming. Windows programming with Visual Studio is fun. So I was very excited when I heard about NT kernel-based Windows running on a CPU … More Surface Pro X benchmark from the programmer’s point of view.

프로그래머 관점에서의 Surface Pro X 벤치마크

Windows on ARM 나는 Windows를 사랑한다. 정말로 사랑한다. 물론 Windows 3.1과 95에 대한 애착은 크지 않지만 NT커널 이후의 Windows는 정말 사랑한다. 또한 Windows 프로그래밍을 좋아한다. Visual Studio로 Windows프로그래밍을 하는 것은 즐겁다. 그래서 x86이외의 CPU에서 돌아가는 NT커널 기반의 Windows의 소식을 들었을때 무척 흥분했다. Visual Studio로 ARM디바이스에서 돌아가는 Windows 어플리케이션을 개발할 수 있다니! 물론 초기 Windows Phone … More 프로그래머 관점에서의 Surface Pro X 벤치마크

nvapi에서 NvAPI_GetMemoryInfo()주소 얻어오기 – (어셈블리어 학습해야하나요?)

Voxel Horizon은 NVAPI를 사용한다. NVAPI는 GPU의 상태를 확인하거나 일부 기능을 제어할 수 있는 nvidia 그래픽 드라이버에서 제공하는 API이다. NVAPI SDK는 nvidia 개발자 홈페이지에서 다운로드할 수 있다. C스타일의 .h / .lib / .dll로 구성된 아주 간단한 SDK다. 이걸로 게임 플레이중 GPU점유율과 GPU온도, 남은 GPU메모리의 양을 확인한다. 물론 일반 유저들을 위한 기능은 아니고 개발할때 필요한 디버깅용 기능으로 … More nvapi에서 NvAPI_GetMemoryInfo()주소 얻어오기 – (어셈블리어 학습해야하나요?)

Compiler Intrinsic을 사용해서 SIMD코드를 작성할때 주의할 점

어셈블리어로 SIMD를 다뤄보지 않고 Compiler Intrinsic으로 SIMD를 접하면 성능이 전혀 향상되지 않는 코드를 짜기 쉽다. 기본적으로 simd명령어로 존재하지 않는 기능은 1:1 치환이 불가능하다. 예를 들어 다음과 같은 코드는 simd명령으로 치환이 불가능하다. a.m128_f32[0] = b.m128_f32[3]; 3번째 성분을 0번째 성분으로 카피하는 명령어 같은건 존재하지 않으므로 범용 명령어의 mov기능만으로 구현된다. a.m128_f32[0] = b.m128_f32[0] + c.m128_f32[0] 이런 코드의 경우 … More Compiler Intrinsic을 사용해서 SIMD코드를 작성할때 주의할 점

SRWLock 빠른 성능의 비결

Windows Vista부터 추가된 스레드 동기화 API가 있다. AcquireSRWLockExclusive()/ReleaseSRWLockExclusive() AcquireSRWLockShared()/ ReleaseSRWLockShared() 가 그것이다. 뭐 함수이름을 보면 금방 눈치챌 수 있듯이 여러 스레드가 동시에 락을 읽기 전용으로 획득하려고 AcquireSRWLockShared()를 호출한다면 대기없이 않고 바로 락을 통과한다. 쓰기 작업을 해야할 경우 AcquireSRWLockExclusive()를 호출하면 된다. 이 경우는 다른 스레드가 AcquireSRWLockShared()로 락을 획득하려고 하는 경우에도 무조건 락이 걸린다. 이게 중요한게 아니고… … More SRWLock 빠른 성능의 비결

SSE를 이용한 4샘플 무분기 치환 for SW Occlusion Culling

요 근래에 Voxel 오브젝트 컬링을 위해 SW Occlusion Culling을 사용한다고 포스팅 했었다. SW Occlusion Culling이라봐야 별거 없다. 잠깐 그 내용을 상기해보면… CPU측에서 사용할 수 있는 Z-Buffer(그냥 32bits float타입의 메모리 버퍼)를 잡는다. Voxel오브젝트의 Min박스의 z값을 그린다. z값이 기존 값보다 작거나 같을 경우만 덮어쓴다. 이후에 테스트할 다른 Voxel오브젝트의 Max 박스의 z값을 z-buffer의 값과 비교한다. 기존값보다 z값이 작으면 … More SSE를 이용한 4샘플 무분기 치환 for SW Occlusion Culling

가변인자 함수 진짜 가변적으로 호출하기.

나는 엔진 코드에서 가변함수 scanf,fscanf등의 함수를 진짜로 가변적으로 호출하곤 했다. 예를 들면 스크립트를 파싱해서 2개의 문자열을 읽을지, 3개의 문자열을 읽을지를 결정해야한고 치자. 코드는 이런식이다. fscanf(fp,”%s %s”,buf0,buf1); // 2개를 읽을 경우 fscanf(fp,”%s %s %s”,buf0,buf1,buf2); // 3개를 읽을 경우   이걸 n개의 문자열을 읽는다고 치면? 모든 n개의 케이스에 대해서 fscanf(문을 일일히 다 만들어놓을순 없지 않은가? “%s “부분은 … More 가변인자 함수 진짜 가변적으로 호출하기.

변수의 값(임시변수,xor) 교환을 컴파일러는 어떻게 처리하는지에 대한 테스트

어제 포스팅했던 xor교환에 대한 추가 포스팅입니다. 페북 타임라인에서 A ,B를 교환하는 C코드를 컴파일러는 어떻게 처리하느냐에 대한 주제가 나왔습니다. 댓글로 쓸 내용이지만 내용이 길어져서 워드프레스 한페이지 정도는 할애해도 될것같아 이쪽으로 옮겨적습니다. 김민장님이 제공해주신 아래 코드로 테스트 해봤습니다. void xor_swap(int &a, int &b) { a = a ^ b; b = a ^ b; a = a … More 변수의 값(임시변수,xor) 교환을 컴파일러는 어떻게 처리하는지에 대한 테스트