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 답글이 올라오면 이메일로 알려드리겠습니다.