helio_atomic_memory_order
std::atomic memory_order
개요
- C++에서 std::atomic 변수를 여러 스레드에서 사용했을 경우 hi(hardware interrupt), si(software interrupt)가 발생하는지를 확인하고, 일반 변수 사용 시, std::atomic 전역 변수 사용 시 성능(처리 속도)를 알아 본다.
- hi, si: 리눅스 top 명령으로 확인할 수 있는 항목 중 hi(hardware interrupt) si(software interrupt)를 의미합니다. 노트북 VM(Linux)에서 helio 테스트 시 hi, si가 상당히 발생하여 성능에 크게 영향을 미치는 것으로 파악했습니다. 소스의 어느 부분(함수)에서 발생하는지 확인하려고 테스트를 진행했습니다.
- 테스트 결과 std::atomic 변수의 경우 '서버'는 hi,si가 발생하지 않았고, '노트북'의 경우 hi가 발생했습니다.
- 서버에서 hi,si는 발생하지 않았지만, std::atomic 변수 사용 시 일반 변수에 비해 처리 속도가 매우 늦으므로 꼭 필요한 경우만 사용해야 할 것으로 판단됩니다.
테스트
📦 테스트 환경
◎ 서버
- H/W Model: Dell R230
- CPU: Intel(R) Xeon(R) CPU E3-1230 v6 @ 3.50GHz 4c/8t.
- OS: CentOS Linux release 7.5.1804 (Core)
- Linux kernel version: 3.10.0 x86_64
- C compiler: g++ --version -> g++ (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3)
◎ 노트북
- H/W Model: LG노트북 gram 16ZD90RU-GX56K M/D: 2023.11.
- CPU: Intel i5-1335U(13th) 2.50GHz 코어:10, 논리 프로세서:12, L1 캐시: 928KB, L2: 6.5MB, L3: 12.0MB
- VM: Virtualbox
- Host OS: Windows 11 Pro
- Guest OS: CentOS 9
- Linux kernel version: 5.14.0 x86_64
- C++ compiler: g++ --version -> g++ (GCC) 11.5.0 20240719 (Red Hat 11.5.0-2)
📦 std::atomic memory_order 성능 테스트
- 개요: atomic 변수를 사용할 때 memory_order 별로 성능에 차이가 나는지 확인
- 테스트 방법: 스레드마다 1억회씩 fetch_add(1, memory_order) 실행, 스레드 1,5,10개 테스트
- 서버 테스트 결과: 차이가 없었다.
◎ memory_order 종류
- std::memory_order_relaxed
- std::memory_order_consume
- std::memory_order_acquire
- std::memory_order_release
- std::memory_order_acq_rel
- std::memory_order_seq_cst
소스 코드
테스트 결과
- memory_order 별 성능 차이는 발견하지 못했다.
- 단순하게 생각하면 thread=1보다 thread=5는 시간이 5배 더 걸릴 것 같지만 테스트 결과 약 20배,
thread=10은 40배 더 걸렸다.
- 각 3번씩 실행해서 평균값을 표시했다.
| memory_order | thread=1 | thread=5 | thread=10 |
|---|---|---|---|
| memory_order_relaxed | 476ms | 9,708ms (20배) | 19,734ms (41배) |
| memory_order_consume | 476ms | 9,373ms (20배) | 19,027ms (40배) |
| memory_order_acquire | 474ms | 9,488ms (20배) | 19,777ms (42배) |
| memory_order_release | 475ms | 9,360ms (20배) | 19,801ms (42배) |
| memory_order_acq_rel | 475ms | 9,598ms (20배) | 18,880ms (40배) |
| memory_order_seq_cst | 477ms | 9,657ms (20배) | 17,581ms (37배) |
Email
답글이 올라오면 이메일로 알려드리겠습니다.
