LINUX.ORG.RU

История изменений

Исправление numas13, (текущая версия) :

Почему «не останется и следа». Они же были сложены в очередь команд. Эта очередь не очищается. Возможно её можно переиспользовать (по крайней мере на глубину в один вызов).

Сделать можно много чего. Вопрос в сложности реализации и полученной пользы.

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

Предсказатель нужен в любом случае. Я уже писал об том, ты видимо не обратил внимания.

A: op
I: ibranch label >> goto L

label:
L: op

# Без предсказателя или если он не знает про ibranch
    A F0 F1  S  D  B  R 
 0  A                  
 1  I  A               
 2     I  A            
 3        I  A         
 4           I  A      
 5              I  A   
 6                 I  A  << label не готов
 7  L              I   
 8     L           I   
 9        L        I   
10           L     I   
11              L  I     << lebel готов
12                 L  I
13                    L

# Предсказатель знает про ibranch
    A F0 F1  S  D  B  R 
 0  A
 1  I  A                << предсказатель уже встречал ibranch
 2  L  I  A             << начинается загрузка с label
 3     L  I  A
 4        L  I  A
 5           L  I  A
 6              L  I  A << label готов
 7                 L  I
 8                    L

Честно, не понял, чем он от ibranch отличается. Кроме того, что занимает регистр ctpr.

Он не зависит от простоев в backend (в твоей реализации). То есть работает как подсказка аппаратуре, что через N тактов (зависит от длины конвейера) будет безусловный переход (не обязательно). Своего рода управляемый delay slots. Он не обязательно должен занимать ctpr, а может работать в том же конвейере. Но если есть предсказатель, то пользы от него будет не так много.

J: jump_delay label << 5 delay slots
A: op
B: op
C: op
D: op
E: op

label:
L: op

    A F0 F1  S  D  B  R 
 0  J                  
 1  A  J               
 2  B  A  J            
 3  C  B  A  J         
 4  D  C  B  A  J      
 5  E  D  C  B  A  J    << CPU увидел jump
 6  L  E  D  C  B  A  J << fetch from label
 7     L  E  D  C  B  A
 8        L  E  D  C  B
 9           L  E  D  C
10              L  E  D
11                 L  E
12                    L

Собственно так деды делали подготовленные переходы в махровые времена. Хотя может всё ещё где-то и используют в каких-то DSP. Я не знаю. :)

Исходная версия numas13, :

Почему «не останется и следа». Они же были сложены в очередь команд. Эта очередь не очищается. Возможно её можно переиспользовать (по крайней мере на глубину в один вызов).

Сделать можно много чего. Вопрос в сложности реализации и полученной пользы.

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

Предсказатель нужен в любом случае. Я уже писал об том, ты видимо не обратил внимания.

A: op
I: ibranch label >> goto L

label:
L: op

# Без предсказателя или если он не знает про ibranch
    A F0 F1  S  D  B  R 
 0  A                  
 1  I  A               
 2     I  A            
 3        I  A         
 4           I  A      
 5              I  A   
 6                 I  A  << label не готов
 7  L              I   
 8     L           I   
 9        L        I   
10           L     I   
11              L  I     << lebel готов
12                 L  I
13                    L

# Предсказатель знает про ibranch
    A F0 F1  S  D  B  R 
 0  A
 1  I  A                << предсказатель уже встречал ibranch
 2  L  I  A             << начинается загрузка с label
 3     L  I  A
 4        L  I  A
 5           L  I  A
 6              L  I  A << label готов
 7                 L  I
 8                    L

Честно, не понял, чем он от ibranch отличается. Кроме того, что занимает регистр ctpr.

Он не зависит от простоев в backend (в твоей реализации). То есть работает как подсказка аппаратуре, что через N тактов (зависит от длины конвейера) будет безусловный переход. Своего рода управляемый delay slots. Он не обязательно должен занимать ctpr, а может работать в том же конвейере. Но если есть предсказатель, то пользы от него будет не так много.

J: jump_delay label << 5 delay slots
A: op
B: op
C: op
D: op
E: op

label:
L: op

    A F0 F1  S  D  B  R 
 0  J                  
 1  A  J               
 2  B  A  J            
 3  C  B  A  J         
 4  D  C  B  A  J      
 5  E  D  C  B  A  J    << CPU увидел jump
 6  L  E  D  C  B  A  J << fetch from label
 7     L  E  D  C  B  A
 8        L  E  D  C  B
 9           L  E  D  C
10              L  E  D
11                 L  E
12                    L

Собственно так деды делали подготовленные переходы в махровые времена. Хотя может всё ещё где-то и используют в каких-то DSP. Я не знаю. :)