- PS2의 VU 부동소수점 곱셈에는 1비트 연산 오차가 있어, 특정 값에서는
1 * X가X와 달라질 수 있음 - VU 개발자 매뉴얼 기준으로
X * 1은 정확성이 보장되지만1 * X는 같은 보장이 없어, 이 차이가 에뮬레이터 감지 신호가 됨 - 예제는 브루트포스로 찾은 문제 발생 값 중 129.5f를 사용해 실제 PS2와 에뮬레이터의 동작 차이를 확인함
- 구현은 VU0 매크로 모드에서
129.5f와1을 곱한 뒤, 원래 입력과 결과가 다른지만 비교하는 단순한 구조임 - PCSX2, Play!, DobieStation, hps2x64는 현재 이 동작을 에뮬레이트하지 않으며, 감지 난이도는 1/5로 평가됨
PS2 VU 곱셈에서 생기는 1비트 오차
- 이 방법은 PS2 에뮬레이터 감지 시리즈의 두 번째 항목이며, VU1, VU0 마이크로 모드, VU0 매크로 모드에서 사용할 수 있음
- 예시는 구현을 단순하게 만들기 위해 VU0 매크로 모드를 사용함
- VU0를 코프로세서처럼 사용하므로 EE CPU에서 직접 실행 가능함
- 별도의 VU 프로그램을 다루지 않아도 됨
- VU 개발자 매뉴얼의
MUL,MULi같은 곱셈 명령어에는 1비트 연산 오차가 있다는 주석이 있음1 * X는 원래 값X와 다를 수 있음VF[fs]를 피승수로 사용하면X * 1형태의 결과 정확성이 보장됨
- 비트가 왜 손실되는지는 정확히 확인되지 않음
감지값과 구현 방식
- 이 오차를 감지하려면 문제를 유발하는 숫자가 필요하며, 가장 쉬운 탐색 방법은 브루트포스임
- 글쓴이는 과거에 0.5 간격으로 문제를 일으키는 첫 250개 숫자 목록을 만들었고, 해당 목록을 gist에 공개함
- 예제 코드는 129.5f를 감지 대상 숫자로 사용함
QMTC2로VF1에129.5f를 설정함VADDw로VF2에1을 만듦VMUL로VF1 = 1 * 129.5f를 계산함QMFC2로 결과를 EE 쪽으로 가져와 입력과 비교함
- 반환값은
in[0] != out[0]이며, 원래 값과 곱셈 결과가 다르면 VU 곱셈 오차가 존재한다고 판단함
에뮬레이터별 영향
- 현재 PCSX2, Play!, DobieStation, hps2x64는 이 PS2 VU 곱셈 동작을 에뮬레이트하지 않음
- 숫자 하나와
1을 곱한 뒤 결과만 확인하면 되기 때문에, 이 감지 방식의 난이도는 1/5 수준임