fp_contract
pragma
부동 소수점 수축이 발생하는지 여부를 결정합니다. 부동 소수점 수축은 두 개의 개별 부동 소수점 연산을 단일 명령으로 결합하는 FMA(Fused-Multiply-Add)와 같은 명령입니다. 각 작업 후에 반올림하는 대신 프로세서가 두 작업 후에 한 번만 반올림할 수 있으므로 이러한 지침을 사용하면 부동 소수점 정밀도에 영향을 줄 수 있습니다.
구문
#pragma fp_contract (
{on
|off
})
설명
기본 컴파일러 옵션을 fp_contract
사용하는 경우 개별 off
부동 소수점 지침을 유지하도록 컴파일러에 지시하는 입니다. on
가능한 경우 부동 소수점 수축 지침을 사용하도록 설정합니다fp_contract
. 이 동작은 Visual Studio 2022 버전 17.0의 새로운 동작입니다. 이전 컴파일러 버전 fp_contract
에서는 기본적으로 .로 설정 on
됩니다.
기본 컴파일러 옵션을 fp_contract
사용하는 경우는 다음과 같습니다 on
. 이 설정은 가능한 경우 부동 소수점 수축 명령을 사용하도록 컴파일러에 지시합니다. 개별 부동 소수점 지침을 유지하도록 off
설정합니다fp_contract
. Visual Studio 2022 버전 17.0 이상 fp_contract
에서는 기본적으로 off
.
부동 소수점 동작에 대한 자세한 내용은 (부동 소수점 동작 지정)을 참조 /fp
하세요.
기타 부동 소수점 pragma 지시문은 다음과 같습니다.
예시
/fp:fast
컴파일러 옵션은 기본적으로 수축을 사용하도록 설정하지만 이 예제의 #pragma fp_contract (off)
지시문은 축소를 해제합니다. 이 샘플에서 생성된 코드는 대상 프로세서에서 사용할 수 있는 경우에도 융합 곱하기 추가 명령을 사용하지 않습니다. 주석 처리 #pragma fp_contract (off)
할 경우 생성된 코드는 사용 가능한 경우 fused-multiply-add 명령을 사용할 수 있습니다.
// pragma_directive_fp_contract.cpp
// On x86 and x64 compile with: /O2 /fp:fast /arch:AVX2
#include <stdio.h>
// remove the following line to enable FP contractions
#pragma fp_contract (off)
int main() {
double z, b, t;
for (int i = 0; i < 10; i++) {
b = i * 5.5;
t = i * 56.025;
z = t * i + b;
printf("out = %.15e\n", z);
}
}
out = 0.000000000000000e+00
out = 6.152500000000000e+01
out = 2.351000000000000e+02
out = 5.207249999999999e+02
out = 9.184000000000000e+02
out = 1.428125000000000e+03
out = 2.049900000000000e+03
out = 2.783725000000000e+03
out = 3.629600000000000e+03
out = 4.587525000000000e+03