다음 줄에 짧은 버전
: aOn
이 0
또는 1
입니다프로세서가 실제로 0 또는 1로 곱셈을 계산합니까? 왜?
aData[i] = aData[i] + (aOn * sin(i));
경우, 프로세서가 실제로 곱셈을 수행 않거나 조건부 다른 결과 (0
에 대한 0
를 해결 않습니다 - 1
에 대한 값)?
긴 버전
나는 부분적으로 Branch Prediction의 효과에 대한보고를 포함 알고리즘 성능의 일관성으로 찾고 있어요.
for (i = 0; i < iNumSamples; i++)
aData[i] = aData[i] + (aOn * sin(i));
은 (분기 예측 성능을 불안정하게 할 수있다)이 코드는보다 안정된 성능을 제공한다 :
가설이이 코드 aOn
와
for (i = 0; i < iNumSamples; i++)
{
if (aOn)
aData[i] = aData[i] + sin(i);
}
0
또는 1
하나 인, 다른 스레드가 루프를 실행하는 동안 토글 할 수 있습니다.
실제 조건부 연산 (위의 예에서는 + sin(i)
)는 이상의 처리를 포함하고 상태가 루프 내에 있어야하는 경우에는 (다만 하나 위의 예에서와 같은 조건의 다수가있다; 또한, aOn
변경이 있어야 루프 당 즉시 영향을 미치지 않음).
성능 일관성을 무시하면 두 옵션 간의 성능 절충은 if
문과 곱셈의 실행에 걸리는 시간입니다.
에 관계없이,이 프로세서가 1
및 0
같은 값에 대한 실제 곱셈을 수행하지 않을 경우, 첫 번째 옵션은 윈 - 윈 솔루션 (아무 분기 예측, 더 나은 성능을) 할 수 있다는 것을 발견하기 쉽습니다.
이 컴파일러는 사람들을 최적화 할 가능성이 높습니다. – iamnotmaynard
필자는 최적화 여부에 상관없이 확인을했으며, '0', '1'및 기타 숫자의 배수 사이의 상대적인 성능에는 아무런 차이가 없습니다 (최적화는 모든 경우에 대해 성능을 약간 향상시킵니다). 그렇다면 최적화가 프로세서가 곱셈을 수행하는지 여부와 정확히 어떤 관련이 있습니까? – Izhaki
@iamnotmaynard 컴파일러는 aOn이 상수가 아니라면 OP를 최적화 할 수는 없지만 OP가 그 값을 나타내지는 않습니다. –