Приложение, с которым я имею дело, имеет большое количество операторов if с характеристиками, которые при любом выполнении выполняются только в одной из ветвей в 90% случаев.
Теперь я могу проверить влияние прогнозирования ветвлений на один оператор if для конкретного процессора, выполнив что-то вроде этого:
#include <iostream>
#include <stdlib.h>
using namespace std;
int main() {
int a;
cin>>a;
srand(a);
int b;
long count=0;
for (int i=0; i<10000; i++) {
for (int j=0; j<65535; j++) {
b = rand() % 30 + 1;
if (b > 15) // This can be changed to get statistics for different %-ages
count += (b+10);
}
}
cout << count <<"\n";
}
У меня вопрос, есть ли способ проверить масштабируемость и влияние прогнозирования ветвлений с помощью нескольких операторов if в реальном крупном приложении для данного ЦП?
По сути, я хочу иметь возможность выяснить, сколько ошибочных прогнозов веток стоит на разных процессорах и их влияние на приложение.
Вы должны принять во внимание сложность ваших веток, компилятор может удалять ветки, используя специфические для архитектуры коды операций, такие как CMOV (сравнивать и перемещать).
Ваш простой пример кода
if (b > 15)
count += (b+10);
Вот код, скомпилированный в машинный язык
;; assembly x86 FASM/NASM syntax
;; WITH branching
MOV ebx, [b] ;; b
MOV ecx, [count] ;; count
CMP ebx, 15 ;; if condition to set flags
JLE .skip ;; { branch/jump over the if body when less than or equal
LEA eax, [ecx + ebx + 10] ;; count + b+10
MOV [count], eax ;; store count
.skip: ;; } label after the if block
;; WITHOUT branching
MOV ebx, [b] ;; b
MOV ecx, [count] ;; count
LEA eax, [ecx + ebx + 10] ;; pre-calc avoiding the need to branch
CMP ebx, 15 ;; if condition to set flags
CMOVLE eax, ecx ;; make eax equal to ecx (current count) when less than or equal
;; avoiding the branch/jump
MOV [count], eax ;; store count
Поэтому, если вы не знаете, как ваш оптимизирующий компилятор оптимизирует ваш код, немного сложно профилировать предсказание ветвления. Если вы проверяете вывод машинного кода и знаете, что у вас много операторов J [условие], тогда достаточно использовать инструмент профилирования кода, упомянутый в комментариях. Попытка развернуть свой собственный тест предсказания ветвлений без использования правильных регистров отладки архитектуры приведет к ситуации, которую я продемонстрировал выше.
Других решений пока нет …