-cl-fast-relaxed-math와 관련하여 OpenCL 사양의 해석에 약간의 문제가 있습니다. 그 컴파일러 플래그의빠른 완화 수학으로 인해 허용되는 정밀도 감소
정의는 다음과 같습니다
가 최적화 옵션 -Cl-유한 수학 전용 및 -Cl 안전하지 않은-수학 최적화를 설정합니다. 이를 통해 IEEE 754 표준 및 부동 소수점 부동 소수점의 경우 7.4, 배정 밀도 부동 소수점의 경우 9.3.9 및 에지에 정의 된 OpenCL 수치 준수 요구 사항을 위반하는 부동 소수점 산술을 최적화 할 수 있습니다 섹션 7.5의 대소 문자 구별 이 옵션을 사용하면 OpenCL 프로그램에서 전 처리기 매크로
FAST_RELAXED_MATH이 정의됩니다.
제 프로그램에서는 기본적으로 정확한 IEEE 준수는 신경 쓰지 않습니다. 그러나 인텔 통합 GPU에서이 플래그를 사용하면 모든 삼각 함수가 자체 고유 구현을 사용합니다. half_sin (스펙에 따라 10 비트 정밀도)의 경우에는별로 중요하지 않습니다. 최악의 경우와 마찬가지로 출력은 여전히 8 비트 일 수 있으므로 사양에서 요구하는 것보다 덜 정밀한 2 비트가 그렇게 나쁘지는 않습니다.
그러나 Intel GPU 구현 (해당 CPU는 정상적으로 작동 함)은 죄용 호출을 대체합니다. 최대 11 비트의 손실을 초래합니다. 반 이상은 버려집니다 (죄를 위해서는 19 비트가 필요합니다). 필자는 개인적으로이를 예상 된 동작으로 간주하지 않으며, 엄격한 IEEE 준수를 요구하거나 기본 내장 함수에서 사용 가능한 정밀도의 대부분을 포기하는 유일한 옵션이있을 때 소프트웨어 개발을 어렵게 만듭니다.
엄밀히 말하면 스펙을 따르고 있다는 것을 알고 있습니다. 컴파일러 플래그를 사용하면 내장 함수의 사용 가능한 정확도를 정의하는 섹션의 수치 준수 요구 사항을 위반할 수 있습니다. 그러나 컴파일러가 NaN을 무시하도록 허용하는 가장 완고한 플래그조차도 기본적으로 모든 내장 함수의 정확성을 무시합니다.
C 세계와 가장 유사한 것은 GCC 플래그 Ffast-math입니다. 컴파일러가 동일하게 수행 할 수 있지만, 경우에 따라 부동 소수점 연산이 연관성이 있다고 가정하더라도 정상적인 수학 라이브러리 함수는 여전히 사용할 수 있습니다.
이러한 종류의 정밀 요구 사항이 일반적으로 어떻게 처리되는지 알고 싶습니다. 인텔은 실제로 사양의 정신을 따르고 있습니까? 누구든지 인텔 GPU가 내장 함수의 정밀도를 부당하게 망치지 않고도 마음에 콘텐츠 (예 : 부동 소수점 연산이 연관성을 가짐)를 최적화하도록 커널을 최적화하는 방법을 알고 있습니까?
컴파일러가 부동 소수점 연산이 native_ * 함수를 사용하여 단지 연관성을 갖는다 고 가정 할 수있는 방법이 없습니다. – sharpneli
아마 당신은 원하는 속도를 얻기 위해 native_ * 함수와 함께 -cl-mad-enable과 -cl-no-signed-zero를보고 싶을 것입니다. – chippies