1

Типы ошибок часто проверяются на наличие ошибок. Но код, который будет продолжать выполняться, может быть указан по-разному.Сохранение конвейера выполнения

if(!ret) 
{ 
    doNoErrorCode(); 
} 
exit(1); 

или

if(ret) 
{ 
    exit(1); 
} 
doNoErrorCode(); 

Один из способов тяжеловеса процессора может спекулировать о филиалах, принятых в ближайшей близости/местности с использованием простых статистических данных - я изучил 4-битный механизм ветвления спекуляции (-2, -1 , 0, + 1, + 2), где нуль неизвестен, а 2 - истинной ветвью.

Учитывая простую технику выше, мои вопросы касаются того, как структурировать код. Я предполагаю, что между основными компиляторами и основными архитектурами должно быть соглашение. Это мои два вопроса

  1. Когда код не является часто посещаемым контуром, значение булевского значения которого смещается при заполнении конвейера?
  2. Спекуляция о ветвлении должна начинаться с истинного или ложного или нулевого (конвейер должен быть заполнен чем-то). Скорее всего, это будет?

ответ

2

Поведение варьируется от центрального процессора, а компилятор часто корректирует инструкции. В этих руководствах вы найдете всю необходимую информацию: http://agner.org/optimize/.

На мой взгляд, единственный способ узнать, что происходит, - прочитать код сборки, сгенерированный компилятором.

+0

спасибо, я дам ему прочитать. –

+0

удивительный контент, много <3 –

2

На gcc вы можете использовать __builtin_expect, чтобы предоставить компилятору информацию о прогнозе ветвления. Чтобы сделать это немного легче, вы можете затем заимствовать вероятные/маловероятные макросы, используемые, например. в ядре Linux:

 
#define likely(x)  __builtin_expect((x),1) 
#define unlikely(x)  __builtin_expect((x),0) 

, а затем, например,

if (unlikely(!some_function()) 
    error_handling(); 
+0

Хорошая информация, спасибо. –

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