C Preprocessor Macro

C Preprocessor에는 Macro라는 기능이 있다. Type specialization을 하고 싶은데 C++ template 따위를 쓰지 못하는 상황이면 (OpenCL C로 커널을 짠다던지…) 매크로를 적극적으로 활용하곤 한다.매크로에는 여러가지 기능이 있는데, 그 중에서도 token concatenation을 해주는 ## 연산자가 아주 유용하다. 다음 코드를 보자. CAT(A, B) 매크로는 토큰 A, _, B를 이어 붙여준다. 그래서 CAT(add, float)와 같이 사용하면 add_float가 된다.그런데 희한하게도… Continue reading C Preprocessor Macro

Learning gem5

Tutorial A bit outdated, so adapt to the recent version by yourself. Setup and Running gem5 is not friendly with virtual environments, such as conda. Disable them before proceeding.

Memory Consistency Model

Introduction 메모리 컨시스턴시 모델은 여러 쓰레드가 메모리를 공유한 상태에서 나올 수 있는 실행 결과에 대한 규칙이다. 여기서 결과라 함은, 쓰레드 상태(레지스터 등 architecturally visible state)와 메모리 상태를 말한다. 외부로부터 쓰레드에 정보가 전달되는 경로가 메모리밖에 없다고 가정하면, 메모리 LOAD가 반환하는 값에 대한 규칙을 정하면 실행 결과 또한 정해진다. 그래서 메모리 컨시스턴시 모델을 메모리 LOAD가 반환하는 값에… Continue reading Memory Consistency Model

RISC-V

Introduction Terminology Execution Environment Interface(EEI) Initial state of the programNumber and type of hartsAccessibility and attributes of memory and I/O regionsBehavior of all legal instructions executed on each hart (ISA)Handling of any interrupts or exceptions raised during execution EEI is reponsible for ensuring the eventual forward progress of each of its harts. The following events… Continue reading RISC-V

Relocation과 PIC

프로그램이 여러 개의 오브젝트 파일로 구성되어 있는 경우 서로의 데이터를 접근하거나 코드를 호출해야 하는데, 링킹을 하기 전까지는 정확한 주소를 알 수 없다. 그래서 컴파일때 이러한 부분들을 적절히 기록해놓고 링킹 때 코드를 수정하여 올바른 주소를 가리키도록 하는 일련의 과정이 필요한데, 이를 Relocation이라고 한다. 다음 예시를 보자. bar.c에서 foo를 접근하는데 아직 foo의 주소를 모르는 상황이다. 그래서 foo를… Continue reading Relocation과 PIC

mmap의 최소 주소값

앞선 ELF 글에서 신경쓰지 않았던 부분이 있는데, 링크시에 text 섹션의 위치를 조절하여 프로그램이 로드되는 가상 주소와 entry point를 조절할 수 있다. 그런데 text 섹션의 위치를 0x10000 보다 낮게 설정하면 segfault가 발생하는 것을 볼 수 있다. 결론부터 말하자면, 파일 내용을 가상 주소에 올릴때 mmap을 사용하는데 매핑 가능한 최소 주소가 높게 설정되어 있을 수 있다. 이 값을… Continue reading mmap의 최소 주소값

ELF 스터디

ELF(Executable and Linkable Format)은 executable file, object file 등에 널리 사용되는 포맷이다. C 컴파일러로 컴파일한 .o 파일이나 링킹까지 마친 a.out 등이 ELF로 되어있다. 리눅스에서 밥먹듯이 사용하는데 내부 구조를 살펴본 적은 없어서 간단하게 공부해 보았다. File Header 다른 파일 포맷과 마찬가지로 첫 부분은 파일 헤더가 차지한다. 32-bit 주소를 사용할 경우 52-byte, 64-bit 주소를 사용할 경우 64-byte를… Continue reading ELF 스터디

Linux 관리

Linux 서버 관리 하면서 만나는 상황들 적는 글. 계속 업데이트 됨. Package Management – Ubuntu Package Version 버전 요구사항이 가장 까다로운 Lustre를 먼저 체크해서 OS, kernel, OFED 버전을 정하자. 예를 들어, 제공되는 설치파일 경로가 아래와 같다 치자. 그러면, OFED-4.7-1.0.0.1, Ubutun 18.04, Linux kernel 4.15.0-64를 맞추어 설치해야 된다. Minor version까지는 달라도 될 수 있지만 (예를 들어,… Continue reading Linux 관리

AMD 망했으면

AMD GPU 관련해서 조우한 문제점들 적는 글. 계속 업데이트 됨. mpirun Hang AMD GPU가 탑재된 서버에서 뜬금없이 mpirun이 안되는 경우가 있다. 원인분석을 위해 strace를 따봤더니 /tmp/.X11-unix/X0 소켓에 연결 후 응답을 기다리고 있었다.서버에 설치된 X 서버가 Xorg임을 확인하고 로그를 확인하니 오류가 있었다. Xorg 잘못인지 AMD 잘못인지는 시간이 없는 관계로 더 추적해보지는 않았다. 또한 왜 mpirun이 굳이… Continue reading AMD 망했으면

컴퓨터 업그레이드

지금 기숙사에서 쓰는 컴퓨터 스펙이다. 2015년 3월에 샀으니 거의 6년을 썼는데, 잔고장 한번 없이 잘 버텨주었다. 끔찍한 파랑색 LED가 달린 케이스 빼고는 훌륭한 구성이다. 그런데 요즘 들어서 브라우저 + 안드로이드 에뮬레이터 + 게임 + 스트리밍 이런식으로 작업을 잔뜩 틀어놓고 쓰다보니 GPU는 괜찮은데 CPU 병목이 심해서 60프레임이 안뽑히는 경우가 많았다.라이젠이 그렇게 잘 뽑혔다고들 하니, 다른 부품은… Continue reading 컴퓨터 업그레이드