CPU 친화적인 코드 작성: 하드웨어 인식 프로그래밍 가이드

2025-03-23
CPU 친화적인 코드 작성: 하드웨어 인식 프로그래밍 가이드

이 글은 드라이브 스루 레스토랑의 비유를 사용하여 명령 파이프라이닝, 메모리 캐싱, 예측 실행이라는 세 가지 중요한 CPU 아키텍처 개념을 설명합니다. 저자는 이러한 메커니즘을 이해하고 이와 연동하여 작동하는 코드를 작성하는 것(하드웨어 인식 프로그래밍)을 통해 소프트웨어 성능을 극적으로 향상시킬 수 있다고 주장합니다. 이 글에서는 수퍼스칼라 실행을 활용하기 위한 루프 언롤링, 캐싱을 최대한 활용하기 위한 데이터 구조 레이아웃 및 액세스 패턴 최적화 등 코드 최적화 기법을 자세히 설명합니다. 궁극적으로 저자는 효율적인 코드 작성은 우선 깔끔하고 유지보수가 용이한 코드를 작성하고, 그 다음 프로파일링을 통해 성능 병목 현상을 파악한 후, 마지막으로 하드웨어 인식 프로그래밍 원칙을 적용하여 이러한 병목 현상을 해결하는 것이라고 강조합니다.

더 보기

Unix spell: 64KB RAM의 기적

2025-01-19
Unix spell: 64KB RAM의 기적

1970년대, Unix 스펠 체커는 믿을 수 없는 과제에 직면했습니다. PDP-11 컴퓨터의 고작 64KB RAM에 250KB 사전을 저장하는 것이었습니다. Douglas McIlroy의 독창적인 해결책은 다단계 접근 방식이었습니다. 처음에는 Bloom 필터가 빠른 조회를 제공했지만, 사전이 커짐에 따라 그는 새로운 해시 압축 스키마를 개발했습니다. 정렬된 해시 코드 간의 차이가 기하 분포를 따른다는 것을 인식하고 Golomb 부호화를 사용하여 거의 이론적 한계에 가까운 압축률을 달성했습니다. 마지막으로, 압축된 데이터를 분할하여 검색 속도를 더욱 향상시켰습니다. 이 이야기는 제약 조건이 있는 최적화에 대한 마스터 클래스이며, 영리한 알고리즘이 어떻게 불가능해 보이는 한계를 극복할 수 있는지 보여줍니다.

더 보기
개발 압축

Linux 컨텍스트 스위칭 내부: 프로세스 상태와 메모리

2025-01-02
Linux 컨텍스트 스위칭 내부: 프로세스 상태와 메모리

이 글에서는 Linux 커널이 프로세스와 그 상태를 어떻게 표현하는지 자세히 설명하고, 주요 데이터 구조인 task_struct와 mm_struct에 초점을 맞춥니다. task_struct는 프로세스 상태, CPU 시간 추적, 스케줄링 정보 등을 관리합니다. mm_struct는 페이지 테이블, 메모리 세그먼트 경계, 아키텍처별 세부 정보 등을 관리합니다. 이 글에서는 이러한 구조체의 필드와 컨텍스트 스위칭에서의 역할을 자세히 설명하여 Linux 커널의 내부 동작에 대한 깊이 있는 이해를 제공합니다.

더 보기

클러스터링의 불가능성 정리: 완벽한 알고리즘이 존재하지 않는 이유

2024-12-26
클러스터링의 불가능성 정리: 완벽한 알고리즘이 존재하지 않는 이유

이 글에서는 클러스터링 알고리즘의 "불가능한 삼각형" 문제를 다룹니다. CAP 정리와 유사하게, 저자는 모든 클러스터링 알고리즘은 크기 불변성, 풍부함, 일관성이라는 세 가지 바람직한 속성 중 하나를 희생해야 한다고 주장합니다. 이 글에서는 각 속성을 정의하고 k-means와 같은 알고리즘이 어떻게 타협하는지 보여줍니다. 결론에서는 개발자는 애플리케이션의 특정 요구 사항에 따라 알고리즘을 선택해야 하며, 완벽한 클러스터링 알고리즘은 수학적으로 불가능하다는 것을 받아들여야 한다고 강조합니다.

더 보기