bfiber_1600
Boost.Fiber Performance
Performance - 성능
성능 측정은 오버헤드 수정과 함께 'std::chrono::highsolution_clock'을 사용하여 수행되었습니다.
코드는 빌드 옵션(variant = release, optimization = speed)을 사용하여 gcc-6.3.1로 컴파일되었습니다.
테스트는 Linux(x86_64)를 실행하는 듀얼 Intel XEON E5 2620v4 2.2GHz, 16C/32T, 64GB RAM에서 실행되었습니다.
1C/1T로 향하는 측정은 단일 스레드 프로세스에서 실행되었습니다.
'Alexander Temerev'의 'microbenchmark syknet'이 이식되어 성능 측정에 사용되었습니다.
루트에서 테스트는 10개의 실행 스레드(ToE:threads-of-execution)를 생성합니다.
actor/goroutine/fiber 등..
생성된 각 'ToE'는 1,000,000개의 ToE가 생성될 때까지 추가로 10개의 ToE를 생성합니다.
'ToE'는 루트에 도달할 때까지 이전 수준에서 합산되어 업스트림으로 다시 전송되는 서수(0 ~ 999,999)를 반환합니다.
테스트는 10~20회 실행되어 각 측정에 대한 다양한 값을 생성했습니다.
Table 1.2. time per actor/erlang process/goroutine (other languages) (average over 1,000,000)
Pthread는 8kB의 스택 크기로 생성되는 반면 std::thread는 시스템 기본값(1MB - 2MB)을 사용합니다.
리소스 고갈(pthread 및 std::thread)로 인해 1,000,000개의 스레드로 마이크로벤치마크를 실행할 수 없습니다.
대신 테스트는 10,000개의 스레드에서만 실행됩니다.
Table 1.3. time per thread (average over 10,000 - unable to spawn 1,000,000 threads)
테스트에서는 대칭 멀티스레딩(Symmetric MultiThreading)이 활성화된 16개 코어(논리 CPU 32개)를 활용합니다.
파이버 스택은 고정 크기 스택에 의해 할당됩니다.
⚛ SMT 설명 (chatgpt)
벤치마크에서 알 수 있듯이 메모리 할당 알고리즘은 멀티스레드 환경의 성능에 중요합니다.
테스트에서는 'glibc'의 메모리 할당 알고리즘(ptmalloc2 기반)과 Google의 TCmalloc(linkflags="-ltcmalloc"을 통해)를 사용합니다.[9]
'work_stealing' 스케줄링 알고리즘에서 각 스레드는 자체 로컬 큐를 갖습니다.
실행할 준비가 된 파이버는 로컬 대기열로 푸시되거나 로컬 대기열에서 팝됩니다.
큐에 준비된 파이버가 부족하면 파이버는 다른 참여 스레드의 로컬 큐에서 도난당합니다.
Table 1.4. time per fiber (average over 1.000.000)
[9] Tais B. Ferreira, Rivalino Matias, Autran Macedo, Lucio B. Araujo
"멀티코어 및 멀티스레드 애플리케이션의 메모리 할당자에 대한 실험적 연구",
PDCAT '11 병렬 및 분산 컴퓨팅, 애플리케이션 및 기술에 관한 제12회 국제 회의 2011 간행물, 페이지 92-98