0.000000000000000000542%의 경우에 발생하는 버그를 고치기 위해 모든 나눗셈을 느리게 만들기

2 hours ago 6

Futhark가 부호 있는 정수의 최솟값을 -1로 나눌 때 생성된 C 코드에서 발생하는 정의되지 않은 동작을 수정함. 32비트 정수 입력 조합 2⁶⁴개 중 하나에 해당하지만, x86에서는 CPU 예외로 프로그램이 종료될 수 있음 수정된 구현은 나눗셈마다 제수가 -1인지 검사하고, 해당하면 부호 없는 정수 연산으로 부호를 반전함. Futhark의 래핑 동작을 유지하는 대신 분기 비용이 추가됨 일반 GPU 벤치마크에서는 측정 가능한 성능 영향이 없었으며, 나눗셈을 반복하는 인위적 벤치마크도 CPU에서는 유의미한 차이가 없었음 같은 반복 나눗셈 벤치마크의 CUDA 실행 시간은 5,548μs에서 12,592μs로 증가함. 수정 전에는 연속된 나눗셈 명령이 배치됐지만, 수정 후에는 그 사이에 여러 분기가 들어갔음 정확성을 위해 수정은 유지하며, 음수가 절대 없음을 아는 경우에는 부호 없는 나눗셈으로 이 비용을 피할 수 있음. 일반적인 벤치마크에서는 사실상 영향이 없어 보이지만 더 저렴한 해결책은 여전히 필요함 2의 보수와 나눗셈의 예외 거의 모든 현대 컴퓨터가 사용하는 2의 보수는 표현 범위가 비대칭임 부호 있는 8비트 정수는 최솟값이 -128, 최댓값이 127이므로 최솟값에 대응하는 양수가 없음 따라서 x / -1의 수학적 결과인 -x는 x가 최솟값일 때 같은 정수 타입으로 표현할 수 없음 32비트 정수를 기준으로 이 문제는 가능한 입력 쌍 2⁶⁴개 중 하나에 해당함 제목의 0.000000000000000000542%는 이 조합 비율이며, 실제 프로그램에서 관측한 발생 빈도는 아님 C 코드 생성의 장점과 의미적 불일치 Futhark의 주요 백엔드는 C 코드를 생성하며, 이 방식에는 세 가지 실용적 장점이 있음 생성 코드를 사람이 읽고 수정하기 쉬워 디버깅이 편리함 대부분의 시스템에 C 컴파일러가 있거나 쉽게 설치할 수 있어 의존성이 적고 이식성이 높으며, 네이티브 코드 생성기를 함께 배포할 필요가 없음 C API를 통해 다른 언어에서 Futhark를 호출할 수 있음 반면 코루틴, 꼬리 호출, 가비지 컬렉션 같은 기능은 C로 표현하거나 효율적으로 구현하기 어려움 Futhark는 의미 체계가 비교적 단순해 이 제약의 영향은 크지 않지만, 미묘하게 잘못된 C 코드를 생성하는 문제는 반복해서 겪음 주된 어려움은 포인터나 버퍼 크기보다 정의되지 않은 동작(undefined behaviour) 에 있음 Futhark 자체는 메모...

Read Entire Article




피플앤툴즈 네트워크
🛍 샵