2013-05-13 1 views
1

Это полезно, когда выполнить эту процедуру, когда LOOPS> BTB_SIZE, например,Как я могу получить размер целевого буфера для вашего процессора (BTB)?

из

int n = 0; 
for (int i = 0; i < LOOPS; i++) 
    n++; 

в

int n = 0; 
int loops = LOOPS/2; 
for(int i = 0; i < loops; i+=2) 
    n += 2; 

может уменьшить ветви промаха.

BTB ref: http://www-ee.eng.hawaii.edu/~tep/EE461/Notes/ILP/buffer.html, но он не сообщает, как получить размер BTB.

+0

Проверить http://xania.org/201602/bpu-part-one Прогнозирование статической ветви на новых процессорах Intel http://xania.org/201602/bpu-part-two Прогнозирование ветвей - часть вторая, а затем его публикации в одном и том же теге (http://xania.org/Microarchitecture-archive); тестовый код находится по адресу https://github.com/mattgodbolt/agner (tests/btb * py) и по адресу https://github.com/rmmh/whomp – osgx

ответ

0

Любой современный компилятор, заслуживающий своей соли, должен оптимизировать код до int n = LOOPS;, но в более сложном примере компилятор позаботится о такой оптимизации; см., например, LLVM's auto-vectorisation, который обрабатывает много видов разворота цикла. Вместо того, чтобы пытаться оптимизировать ваш код, найдите соответствующие флаги компилятора, чтобы заставить компилятор выполнять всю тяжелую работу.

0

С точки зрения BTB обе версии одинаковы. В обеих версиях (если скомпилировано неоптимизировано) существует только один условный скачок (каждый из которых начинается с i<LOOPS), поэтому в коде есть только одна цель перехода, поэтому используется только один целевой буфер ветвления. Вы можете увидеть полученный код ассемблера, используя Matt Godbolt's compiler explorer.

Там будет разница между

for(int i=0;i<n;i++){ 
    if(i%2==0) 
     do_something(); 
} 

и

for(int i=0;i<n;i++){ 
    if(i%2==0) 
     do_something(); 
    if(i%3==0) 
     do_something_different(); 
} 

Первая версия будет нуждаться в 2 целевые ветви буферов (для for и if), второй будет нуждаться в 3 целевые ветви буферов (для for и для двух if s).

Однако, how Matt Godbolt found out, есть 4096 буферов целевой ветви, поэтому я бы не стал слишком беспокоиться о них.

Смежные вопросы