Wersja krótka
W kolejnym wierszu:Czy procesorzy faktycznie obliczają mnożenie przez zero lub jeden? Czemu?
aData[i] = aData[i] + (aOn * sin(i));
Jeśli aOn
jest 0
lub 1
, czy procesor wykonują mnożenie, czy też warunkowo wypracowania wyniku (0
dla 0
, inne -wartość dla 1
)?
The Long Version
szukam do algorytmu konsystencji wydajności, co częściowo wiąże się zajrzeć do skutku Branch Prediction.
Przypuszcza się, że ten kod:
for (i = 0; i < iNumSamples; i++)
aData[i] = aData[i] + (aOn * sin(i));
zapewnia bardziej stabilne wyniki niż kod (gdzie przewidywania rozgałęzień mogą destabilizować wydajności)
for (i = 0; i < iNumSamples; i++)
{
if (aOn)
aData[i] = aData[i] + sin(i);
}
z aOn
jest albo 0
lub 1
, i może przełączać podczas wykonywania pętli przez inny wątek.
W kalkulacji warunkowy (+ sin(i)
w powyższym przykładzie) obejmuje więcej przetwarzania i jeśli warunek musi znajdować się w pętli (istnieje mnogość warunkach, nie tylko jednego, jak w przykładzie powyżej, również zmiany aOn
powinny efekt natychmiast, a nie na pętlę).
Zignorowanie spójności wydajności, kompromis pomiędzy dwiema opcjami jest w czasie niezbędnym do wykonania instrukcji if
i mnożenia.
Bez problemu można zauważyć, że jeśli procesor nie wykonałby faktycznego mnożenia dla wartości takich jak 1
i 0
, pierwsza opcja mogłaby być rozwiązaniem wygrywa-wygrana (bez przewidywania rozgałęzień, lepsza wydajność).
Jest wielce prawdopodobne, że kompilator by zoptymalizować te na zewnątrz. – iamnotmaynard
Mam sprawdzanie zi bez optymalizacji i nie ma wpływu na względną wydajność między mnożnikami "0", "1" i dowolnymi innymi liczbami (optymalizacja nieznacznie poprawia wydajność dla wszystkich przypadków). Jak dokładnie optymalizacja odnosi się do tego, czy procesor dokonuje multiplikacji? – Izhaki
@iamnotmaynard Kompilator nie może go zoptymalizować, chyba że aOn jest stałą, ale OP nie daje żadnego wskazania, że tak jest. –