System Programming
SIMD #0 SIMD의 기본 개념과 병렬 처리 원리
SIMD란 Single Instruction, Multiple Data의 약자하나의 명령어로 여러 데이터를 동시에 처리하는 병렬 처리 기법 기본 원리일반 스칼라 연산:a[0] + b[0] = c[0] // 1번 실행a[1] + b[1] = c[1] // 2번 실행a[2] + b[2] = c[2] // 3번 실행a[3] + b[3] = c[3] // 4번 실행SIMD 벡터 연산:[a0, a1, a2, a3] + [b0, b1, b2, b3] = [c0, c1, c2, c3] // 1번에 실행! CPU 아키텍처와 벡터 연산의 관계레지스터 크기와 처리 능력128비트 레지스터 (SSE): 4개의 32비트 float 동시 처리256비트 레지스터 (AVX/AVX2): 8개의 32비트 float 동시 처리..
LLVM tutorial #0 Architecture
전통적인 컴파일러는 소스 언어와 타겟 아키텍쳐가 강하게 결합되어있어 새로운 언어나 새로운 하드웨어를 지원하기 위해선 컴파일러 전체를 다시 작성해야했다.이 구조의 문제점은 당연히 N개의 언어와 M개의 타겟을 지원하려면 N × M개의 컴파일러가 필요하다는 것이다. LLVM 3단계 설계LLVM을 활용하면 N + M개만 필요하다.전통적 방식:C 컴파일러 → x86 코드C 컴파일러 → ARM 코드Rust 컴파일러 → x86 코드Rust 컴파일러 → ARM 코드(4개 필요)LLVM 방식:C → LLVM IR ┐Rust → LLVM IR ┼→ LLVM IR → x86 ┼→ LLVM IR → ARM(2개 프론트엔드 + 2개 백엔드 = 4개) 각 단계를 간단히 설명하자면 1단계 Frontend역할..
x86 Instruction Set, SIMD, Image Processing Algorithms, DSP Routines, MMX, SSE, AVX #0 Simple Assembly Program
1. Project 생성Visual Studio에서 파일 -> 새로 만들기 -> 프로젝트 -> Windows Console Application 선택하여 프로젝트를 생성한다. 2. Source Files 작성cpp 파일을 삭제 후 Windows MASM 32비트 어셈블리 코드 를 작성한다.// main.asm.386.model flat.codestart PROC mov eax,213 add eax,432 retstart endpend start 3. masm 빌드 설정- project 우클릭 -> Build Dependencies -> Build Customizations... -> masm 선택- assmebly 파일 우클릭 -> Properites(속성..
CUDA #0 환경 구성
1. Labnvidia-smi Sun Sep 7 20:37:56 2025 +-----------------------------------------------------------------------------------------+| NVIDIA-SMI 560.94 Driver Version: 560.94 CUDA Version: 12.6 ||-----------------------------------------+------------------------+----------------------+| GPU Name Driver-Model | Bus-Id Disp.A | Volat..
[OS] I/O처리 방식: Non-Blocking
논 블로킹 모드로 프로그래밍을 한다는 것은 먼저 블로킹의 의미 부터 명확히 해야한다. 일반적으로 블로킹은 "운영체제(커널)에게 어떤 요청을 하고 결과를 운영체제가 알려줄 때까지 기다린다" 를 의미한다. 예를 들어 데이터베이스 서버에 요청하고 그 결과를 데이터베이스 서버가 알려줄 때까지 기다린다도 같은 얘기이다.블로킹: 프로그램이 운영체제(커널) 또는 외부 서비스(DB, 네트워크 등) 에 요청을 보내고, 해당 요청의 결과가 반환될 때까지 대기(멈춤) 하는 상태. connect() 를 호출하면 보통은 운영체제가 원격 서버와 연결하고 그 결과를 알려준다. 연결하는데 지연가능한 시간은 1초 이내, 수초 또는 수분이 될 수 있다. 하나의 연결을 위해 이를 수행하는 프로세스는 장시간을 대기(블로킹)할 수 있으며 그..
![[C/interrupt] IRQs: Hardware, Software](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdna%2FpqO4a%2FbtsKNWdZV0m%2FAAAAAAAAAAAAAAAAAAAAAJqiI_bjowc5ZADTznV9FeqyoROZNSrymSI0oEWdrC3c%2Fimg.png%3Fcredential%3DyqXZFxpELC7KVnFOS48ylbz2pIh7yKj8%26expires%3D1761922799%26allow_ip%3D%26allow_referer%3D%26signature%3D9bVpHVOh9tOENYv4dCPRZbSBaNU%253D)
[C/interrupt] IRQs: Hardware, Software
장치들은 처리할 작업이 준비되었음을 컴퓨터 시스템의 다른 부분에 알리기 위해 여러가지 방법을 사용한다.하드웨어와 소프트웨어 간의 비동기 통신을 효율적으로 처리하기 위해 IRQ가 필요하다. IRQ는 하드웨어 장치에서 이벤트가 발생했을 때 CPU가 이를 처리하도록 알려주는 역할을 한다. IRQ 정보를 확인하기 위해 다음 명령어를 사용할 수 있다.$ cat /proc/interrupts또는$ mpstat -A handle_IPI는 ARM 아키텍처에서 다중 프로세서 간 인터럽트(IPI)를 처리하는 함수이다.void handle_IPI(int ipinr, struct pt_regs *regs){ switch (ipinr) { case IPI_TIMER: tick_receive..
Linux Device Driver 기초 #8 PCI 드라이버
PCI(Peripheral Component Interconnect) 드라이버버스는 전기적 인터페이스와 프로그래밍 인터페이스로 구성된다.주로 현대 데스크탑 및 대형 컴퓨터에서는 PCI 버스 가 많이 사용된다. PCI 장치가 시스템의 하드웨어를 찾고 접근하는 방법특정 드라이버가 하드웨어를 탐지하고 접근할 수 있도록 지원 32비트 데이터 버스를 기본으로 사용하며, 64비트 확장도 포함되어 있음PCI 버스는 ISA보다 높은 클럭 속도로 더 나은 성능을 달성플랫폼 독립성을 고려한 설계로, 다양한 프로세서 아키텍처(IA-32, Alpha, PowerPC, SPARC64, IA-64 등)에서 사용됨특히 중요한 점은 PCI가 인터페이스 보드의 자동 감지 및 구성(auto-detection)을 지원한다는 점이는 점퍼가..
[C/CPU-affinity] 프로세스 CPU Affinity 설정
CPU Affinity 란Asymmetric multiprocessing (AMP)와 symmetric multiprocessing (SMP)는 여러 프로세서를 사용하는 멀티프로세서 시스템에서의 처리 방식이다. 이 두 방식의 차이점을 이해하면 멀티프로세서 환경에서 프로세서가 어떻게 상호작용하고 작업을 분배하는지 알 수 있다.Asymmetric Multiprocessing (AMP)하나의 메인 프로세서만 시스템 리소스(예: 메모리, 입출력 장치 등)에 직접 접근하고, 시스템의 데이터 구조에 액세스한다.장점은 시스템 설계가 단순하고, 동기화에 따른 오버헤드가 줄어들어 성능이 향상된다단점은 하나의 프로세서에 작업이 집중될 수 있다는 점이며, 시스템 확장성(scalability)에서 한계가 있다.Symmetri..
Netlink Sockets #1 내부 아키텍쳐, 메세지 포맷
Netlink는 Linux kernle 내부 메세징 시스템으로 kernle과 user space 간의 통신 수단으로 사용된다. ■ Linux의 IP 패킷 포워딩 절차 ____ +---------------+ +->-| FW |---> | TCP, UDP, ... | | +----+ +---------------+ | | ^ v | _|_ +--------->|..