Show HN: C discrete event SIM w stackful coroutines가 SimPy보다 45배 빠르다
요약
Cimba는 C와 어셈블리 언어로 작성된 고속 이산 사건 시뮬레이션(DES) 라이브러리로, 프로세스 지향적 모델링과 멀티쓰레드 병렬성을 결합하여 높은 성능을 제공합니다. 특히 Python 기반의 SimPy 대비 압도적인 속도를 보여주며, 복잡한 실험 설계와 데이터 수집 기능을 통합했습니다.
핵심 포인트
- C/어셈블리 기반으로 Python보다 월등히 빠름 (SimPy 대비 최대 70배).
- 멀티쓰레드 병렬성을 활용하여 대규모 시뮬레이션에 적합함.
- 실험 설계(DoE) 원칙을 적용한 트라이얼 배열 및 통계 계산 지원.
- CUDA 루틴 호출 등 다른 라이브러리와의 쉬운 통합 가능.

Cimba는 C와 어셈블리 언어로 작성된 범용의 고속 이산 사건 시뮬레이션(discrete event simulation) 라이브러리로, 프로세스 지향적인 시뮬레이션 세계관을 표현력 있게 제공하며, 공유 메모리 공간에서 멀티쓰레드 트라이얼 병렬성(multithreaded trial parallelism)을 결합하여 최신 데스크톱 컴퓨터에서 높은 성능을 발휘합니다. 시뮬레이션되는 프로세스는 pthreads 내부의 스택풀 코루틴(
-
통합 로깅 및 데이터 수집 기능이 있어 모델을 실행하고 내부에서 무슨 일이 일어나고 있는지 이해하기 쉽습니다. 여기에 오류의 근원을 정확히 파악할 수 있는 사용자 지정 단언(custom asserts)도 포함됩니다.
-
전체 실험 설계가 다양한 매개변수를 가진 트라이얼 배열로 표현되며, 모든 트라이얼은 병렬로 실행되고 통계가 계산되며, 이 모든 것이 하나의 프로그램에서 이루어집니다. Cimba의 아키텍처는 트라이얼 배열을 설정할 때 실험 설계(Design of Experiments) 원칙을 적용하도록 강력하게 장려합니다.
-
C 라이브러리로서 Cimba는 다른 라이브러리 및 프로그램과의 쉬운 통합을 가능하게 합니다. 모델 물리 계산을 위해 CUDA 루틴을 호출하거나 GPU 기반의 에이전트적 동작(agentic behavior)으로 시뮬레이션 모델을 향상시킬 수 있습니다. 표준화되고 잘 문서화된 C 호출 규약(C calling convention) 덕분에 다른 프로그래밍 언어에서도 Cimba 시뮬레이션 엔진을 호출할 수 있습니다.
-
빠름: 멀티스레드 병렬 실행에서 오는 속도는 시뮬레이션 모델링에 높은 해상도를 제공합니다. 몇 초 만에 수백 번의 복제(replications)와 매개변수 변화를 실행하여 실험에서 좁은 신뢰 구간(confidence intervals)과 매개변수 변화를 따라 높은 밀도의 데이터 포인트를 생성할 수 있습니다.
-
관련 벤치마크는 Python 시뮬레이션 패키지 SimPy입니다. Cimba 모델은 SimPy 동등 모델보다 훨씬 빠르게 실행됩니다. 아래 차트는 SimPy와 Cimba로 구현된 간단한 M/M/1 대기열(queue)에서 초당 처리되는 시뮬레이션 이벤트 수를 벽시계 시간(wall clock time) 기준으로 보여줍니다. Cimba는 기본 릴리스 빌드와 프로파일러 가이드 최적화(PGO) 최대 속도 빌드 모두로 표시되어 있습니다.

Cimba는 이 벤치마크를 SimPy보다 70배 빠르게 실행합니다. 실제로 Cimba의 처리량은 SimPy가 모든 64개 논리 코어를 사용했을 때(15.5 M events/sec 결합)보다 거의 세 배 높은 수준입니다(43.1 M events/sec).
멀티스레딩(multithreading) 환경에서 Cimba는 SimPy의 동일 모델 대비 실행 시간을 98.6% 줄입니다. 이는 시뮬레이션 실험을 분 단위가 아닌 초 단위로, 또는 시간 단위가 아닌 분 단위로 수행할 수 있다는 것을 의미합니다. 성능 우위의 주된 이유는 컴파일된 C 코드와 직접 작성한 어셈블리(assembly) 코드가 런타임에 해석되어야 하는 Python 코드보다 항상 훨씬 빠르게 실행되기 때문입니다. 이 벤치마크에 대한 기술적 세부 사항은 문서를 참조하십시오.
-
또 다른 성능 비교 지점은 대규모 병렬 이산 사건 시뮬레이션(PDES, Parallel Discrete Event Simulation)에 관한 문헌에서 찾을 수 있습니다. 이러한 모델에서는 각 시뮬레이션 실행이 많은 물리적 코어에 분산됩니다.
Fujimoto (2015)는 PDES 알고리즘의 성능이 각 코어의 내재적인 클럭 속도 제한으로 인해 초대규모 병렬 슈퍼컴퓨터에서 초당 코어당 약 250k 이벤트 수준에 도달했으며, 최근 몇 년간의 추가적인 성능 향상은 코어 수를 늘리는 것에서 온다고 언급합니다. -
Cimba는 이보다 코어당 두 자릿수(two orders of magnitude) 더 빠르게 실행됩니다. 위 벤치마크에 사용된 CPU는 물리적 코어가 32개이며, 물리적 코어당 2개의 스레드를 실행합니다. Cimba는 단일 코어에서 초당 42M 이벤트를, 32개 물리적 코어에서 초당 34M 이벤트/코어를 실행했습니다. 그 이유는 전체 이벤트 큐를 '핫(hot)' CPU 캐시 메모리에 유지하는 것이 별도의 장치 간 링크를 통해 이벤트를 통신하는 것보다 자릿수만큼 빠르기 때문입니다.
-
더 높은 속도가 필요하다면, 각 시뮬레이션 프로세스 내부에서 대규모 병렬 컴퓨팅을 위해 CUDA 커널을 사용할 수 있습니다. 예를 들어, AI 기반 에이전트나 복잡한 물리 계산에 활용할 수 있습니다. 튜토리얼 중 하나에서는 멀티스레드 트라이얼과 여러 GPU에서 실행되는 CUDA 함수를 결합하는 방법을 시연합니다.
-
신뢰성(Reliable): Cimba는 잘 설계된 오픈 소스입니다. 얻게 되는 결과에 있어 의문점이 없습니다.
-
코드는 각 함수에서 전제 조건(preconditions), 불변 조건(invariants), 사후 조건(postconditions)을 강제하기 위해 어설션(assertions)을 광범위하게 사용합니다. 이 어설션은 Cimba 함수의 예상 입력 및 출력에 대한 자체 강제 문서 역할을 합니다.
-
각 모듈에 대해 단위 테스트(unit tests)가 있으며, 여기에는 의사 난수 분포에 대한 포괄적인 통계적 적합도 검정(statistical goodness-of-fit tests)이 포함됩니다. 디버그 빌드(모든 어설션 활성화)에서 단위 테스트 배터리를 실행하면 상세하게 정확한 작동 여부를 확인할 수 있습니다. 터미널 명령줄에서
meson test -C build를 사용하면 됩니다. -
Cimba는 정의되지 않은 동작(undefined behavior)에 대한 검사기(UBSan), 메모리 주소 안전성(ASan), 스레드 안전성(TSan), 그리고 메모리 누수(LeakSan)에 대한 검사기와 호환됩니다. 이 검사기들은 우리의 신뢰성 주장에 대한 공개적인 검증으로, 저장소에 푸시될 때마다 GitHub 러너에서 자동으로 실행되며, 여기를 참조하세요: https://github.com/ambonvik/cimba/actions
-
코드는 최신 및 최고의 AI 도구들(사용 가능해지는 대로)에 의해 정기적으로 적대적 검토(adversarial review)를 거칩니다. 가장 최근에는 Anthropic Claude Fable 5 (2026년 8월)와 OpenAI GPT 5.6 Sol (2026년 9월)이었습니다. 이러한 검토에서 발견된 모든 버그는 수정되며, 후속 검증 검토가 진행됩니다. 검토 내용은 다음 링크에서 확인할 수 있습니다: https://github.com/ambonvik/cimba/tree/main/code_reviews
-
-
무료: Cimba는 대부분의 연구 그룹 예산에 적합할 것입니다.
Cimba를 무엇에 사용할 수 있나요?
이것은 21세기 Simula67의 후예 정신을 담은 범용 이산 사건 시뮬레이션 라이브러리입니다. 예를 들어 다음을 모델링하는 데 사용할 수 있습니다:
- 컴퓨터 네트워크,
- 교통 네트워크,
- 운영 체제 태스크 스케줄링,
- 제조 시스템 및 작업장(job shops),
- 군사 지휘 통제 시스템,
- 병원 및 응급실 환자 흐름,
- 은행 창구와 매장 계산대 같은 대기열 시스템(queuing systems),
- 대중교통 및 쓰레기 수거 같은 도시 시스템,
- 그리고 상대적으로 단순한 구성 요소 간의 상호작용으로 전체 시스템 복잡성이 발생하는 유사한 종류의 많은 애플리케이션 도메인들.
내부 구조를 살펴보면 추가적인 재사용 가능한 내부 구성 요소들도 발견할 수 있습니다. Cimba는 스레드 안전한 cactus stack 위에서 자체 작업을 수행하는 stackful coroutines를 포함하고 있습니다. 범용 소형 객체를 위한 빠른 메모리 풀 할당자, 침투형 연결 리스트(intrusive linked lists), 그리고 피보나치 해싱을 사용하여 이진 힙과 개방 주소 지정 해시 맵을 결합한 hash-heap이 있습니다. 비록 공개 Cimba API의 일부는 아니지만, 이러한 구성 요소들은 필요하다면 모델에서도 사용할 수 있지만, cmi_ 네임스페이스에 있는 모든 것은 향후(사소한) 버전에서 변경될 수 있음에 유의하십시오.
코드는 어떻게 생겼나요?
이것은 C 코드입니다. 예시로, 특정 시점에 발생하는 몇 가지 이산 제어 이벤트와 활성 프로세스를 결합한 단일 스레드 M/M/1 대기열 시뮬레이션 전체 프로그램입니다.
#include <cimba.h>
#include <stdio.h>
...
이 코드는 다음 출력을 생성할 것입니다:
Queue의 버퍼 레벨
개수 평균 표준편차 분산 왜도 ex과잉분산
1.313e+06 2.275 3.286 10.80 2.226 6.687
...
참고로, 위 코드에서는 주석을 의도적으로 생략했습니다. 이는 코드가 상당히 자명하여(self-explanatory) 보일 것이라 기대했기 때문입니다. 더 많은 사용 예시와 설명을 원하시면 ReadTheDocs의 튜토리얼을 참고해 주세요.
그렇다면, 이 속도를 어디에 사용할 수 있을까요?
위에서 보여드렸듯이, 관련 벤치마크에서 SimPy보다 약 70배 빠릅니다. 이는 결과를 '커피 한 잔 내릴 시간'만큼 기다리는 것이 아니라 거의 즉시 얻을 수 있다는 의미입니다.
만약 특정 시간 및 컴퓨팅 자원 예산 내에서 SimPy로 10번의 반복(replication)을 실행할 수 있다면, Cimba로는 700번을 실행할 수 있습니다. 이는 결과의 신뢰 구간(confidence interval)을 거의 10배 가좁혀줍니다. 자세한 내용은 이 주제에 대한 저희 블로그 게시물 속도는 (통계적) 검정력입니다를 참고해 주세요.
또는 훨씬 더 많은 매개변수 변화(parameter variation)를 시도할 수 있습니다. test_cimba.c의 실험은 네 가지 다른 수준의 서비스 프로세스 변동성(service process variability)에서 M/G/1 큐를 시뮬레이션합니다. 각 변동성 수준마다 다섯 가지 시스템 이용률(system utilization) 수준을 시도합니다. 매개변수 조합당 10번의 반복이 있어, 총 4 * 5 * 10 = 200회의 시도가 이루어집니다. 각 시도는 평균 서비스 시간이 항상 1.0 시간 단위인 백만 시간 단위 동안 지속됩니다.
이 전체 시뮬레이션은 Arch Linux와 AMD Threadripper 3970X에서 약 1초 만에 실행되며, 아래 차트를 생성합니다.

또는 좀 더 '실제적인' 예시를 보려면 튜토리얼 5를 참고하세요. 동일한 64코어 Threadripper와 듀얼 RTX 3090 GPU를 사용하여, 상세한 3차원 물리 시뮬레이션이 포함된 AWACS 시나리오의 300개 트라이얼을 73초 만에 실행합니다. 각 트라이얼은 1000 x 1000 해리 마일 합성 지형에서 (해상도 약 1초각, 즉 약 30미터) 천 개의 목표 프로세스(코루틴)와 하나의 센서 프로세스(코루틴)에 대한 6시간 시뮬레이션입니다. 센서 프로세스는 가시선 기하학(line-of-sight geometry), 지형 마스킹(terrain masking), CA-CFAR 탐지 기능을 갖춘 상수 감마 클러터(constant-gamma clutter) 및 정반사 다중 경로(specular multipath)를 포함하는 스캐닝 S-밴드 감시 레이더를 모델링합니다. 이 모델은 0.04초의 레이더 체류 간격(time steps)을 사용합니다.
아래 스크린샷은 이 시뮬레이션의 한 프레임을 보여줍니다. 각 목표물의 크기는 현재 레이더 단면적이며, 색상은 현재 탐지 상태를 나타냅니다. AWACS를 나타내는 빨간색 구체 위의 벡터는 레이더 엽(radar lobe)의 현재 방향을 표시합니다. 이 시각화는 ParaView에서 수행되었습니다.

Cimba는 사용자가 어떤 목적으로 시뮬레이션을 하든, 현대 컴퓨터 아키텍처에서 사용 가능한 모든 컴퓨팅 성능을 활용할 수 있게 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 HN Chip/GPU의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기