Насколько велик буфер предсказания ветвления для типичного современного процессора?

Приложение, с которым я имею дело, имеет большое количество операторов 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 в реальном крупном приложении для данного ЦП?

По сути, я хочу иметь возможность выяснить, сколько ошибочных прогнозов веток стоит на разных процессорах и их влияние на приложение.

4

Решение

Вы должны принять во внимание сложность ваших веток, компилятор может удалять ветки, используя специфические для архитектуры коды операций, такие как 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 [условие], тогда достаточно использовать инструмент профилирования кода, упомянутый в комментариях. Попытка развернуть свой собственный тест предсказания ветвлений без использования правильных регистров отладки архитектуры приведет к ситуации, которую я продемонстрировал выше.

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector