피드로 돌아가기
What is the most efficient way to evaluate poker hands at scale?
Dev.toDev.to
Backend

LUT와 SIMD 기반 설계를 통한 초당 1억 회 이상의 포커 핸드 평가 구현

What is the most efficient way to evaluate poker hands at scale?

Stojan Kojo2026년 6월 7일8advanced

Context

런타임에 스트레이트나 플러시를 판별하는 조건문 기반 로직은 분기 예측 실패와 높은 CPU 점유율을 유발하는 병목 지점임. 특히 10k hands/sec 이상의 고부하 환경에서 O(N) 이상의 시간 복잡도는 실시간 시뮬레이션 및 AI 학습에 치명적인 지연 시간을 초래함.

Technical Solution

  • 모든 5카드 조합(2,598,960개)의 강도를 미리 계산하여 메모리에 적재하는 Lookup Table(LUT) 구조 설계
  • 각 카드 랭크에 소수(Prime Number)를 할당하고 곱 연산을 통해 고유한 해시 값을 생성하는 Cactus Kev 알고리즘 적용
  • 비트마스크(Bitmask)와 비트 시프트 연산을 활용하여 CPU 단일 사이클 내에 플러시 및 스트레이트 여부를 판별하는 로직 최적화
  • AVX2/AVX-512 SIMD 벡터화를 통해 8~16개의 핸드를 단일 레지스터에서 병렬 처리하는 배치 평가 구조 도입
  • 7카드 게임의 경우 21개의 5카드 조합을 생성하여 5-Card LUT를 반복 참조하는 7-to-5 리덕션 전략 채택
  • 무거운 평가 로직을 메인 게임 루프에서 분리하여 gRPC 기반의 Stateless Evaluator Service로 오프로딩하는 마이크로서비스 아키텍처 구성

1. 런타임 조건문이 과도한 구간에서 입력 값의 도메인이 유한한지 확인하여 LUT 도입 검토

2. 대량의 단순 반복 연산 필요 시 SIMD 벡터화 가능 여부를 분석하여 처리량 극대화

3. 고성능 코어 로직은 C++/Rust 등 저수준 언어로 구현하고 gRPC 등 경량 프로토콜로 서비스 분리

4. LUT 생성 로직의 무결성을 검증하기 위해 Brute-force 참조 구현체와 비교하는 CI/CD 검증 단계 구축

원문 읽기