테일슬레이어: RAM 읽기 꼬리 지연 시간 감소 라이브러리
테일슬레이어(Tailslayer)는 DRAM 리프레시(refresh) 지연으로 인해 발생하는 RAM 읽기의 꼬리 지연 시간(tail latency)을 줄여주는 C++ 라이브러리입니다. 이 라이브러리는 여러 독립적인 DRAM 채널에 데이터를 복제하고, 가장 먼저 응답하는 결과를 활용하는 헤지드 리드(hedged read) 방식을 사용합니다. 이를 통해 실무자들은 시스템의 메모리 읽기 지연과 관련된 성능 병목을 해결할 수 있어 매우 중요합니다.
테일슬레이어(Tailslayer)는 DRAM 리프레시 지연으로 인해 발생하는 RAM 읽기의 꼬리 지연 시간을 줄여주는 C++ 라이브러리입니다. 이 라이브러리는 상관관계가 없는 리프레시 스케줄을 가진 여러 독립적인 DRAM 채널에 걸쳐 데이터를 복제하며, AMD, 인텔, 그리고 그라비톤(Graviton)에서 작동하는 (문서화되지 않은!) 채널 스크램블링(channel scrambling) 오프셋을 사용합니다. 요청이 들어오면 테일슬레이어는 모든 복제본에 대해 헤지드 리드를 발행하여, 가장 먼저 응답하는 결과를 바탕으로 작업을 수행할 수 있도록 합니다.
사용법 라이브러리 코드는 hedged_reader.cpp에서 확인할 수 있으며, 이 라이브러리를 사용하는 예제는 tailslayer_example.cpp에서 찾을 수 있습니다. 이를 사용하려면 include/tailslayer 디렉토리를 프로젝트에 복사한 뒤 #include <tailslayer/hedged_reader.hpp>를 추가하십시오. 현재 이 라이브러리는 두 개의 채널에서 작동하지만(향후 업데이트 예정!), 벤치마크에서는 완전한 N-way 사용이 가능합니다.
값 타입(Value type)과 두 가지 함수를 템플릿 매개변수로 제공해야 합니다:
- 신호 함수(Signal function): 외부 신호를 기다리는 루프를 추가합니다. 이는 언제 읽을지를 결정합니다. 읽고자 하는 인덱스를 반환하면 읽기가 즉시 실행됩니다.
- 최종 작업 함수(Final work function): 값이 읽힌 직후 해당 값을 전달받습니다. 여기에 원하는 값 처리 코드를 추가하십시오.
코드 예제:
include <tailslayer/hedged_reader.hpp>
[[gnu::always_inline]] inline std::size_t my_signal() {
// 이벤트를 기다린 후 읽을 인덱스를 반환합니다.
return index_to_read;
}
template
ArgList를 통해 두 함수에 인수를 전달할 수 있습니다:
tailslayer::HedgedReader<T, my_signal, my_work
reader{};
또한 생성자에 다른 채널 오프셋, 채널 비트, 복제본 수를 선택적으로 전달할 수도 있습니다.
참고: 각 insert는 요소를 N회(N은 복제본 수) 복사합니다. 백엔드에서 주소 계산 작업을 수행하므로, 테일슬레이어가 논리적 인덱스를 사용하는 헤지드 벡터처럼 작동할 수 있습니다. 또한 각 복제본은 별도의 코어에 고정(pin)되며, 읽기가 발생할 때까지 해당 코어에서 신호 함수에 따라 스핀(spin) 대기합니다.
예제 빌드 방법 make ./tailslayer_example
벤치마크 및 스파이크 타이밍 discovery/ 디렉토리는 DRAM 리프레시 동작을 특성화하는 데 사용된 지원 코드를 포함하고 있습니다:
- discovery/benchmark/: 채널 헤지드 리드 벤치마크
- discovery/trefi_probe.c: 리프레시 주기를 측정하기 위한 스파이크 타이밍 프로브
cd discovery/benchmark make sudo chrt -f 99 ./hedged_read_cpp --all --channel-bit 8