Конвейер расчета регистровC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Конвейер расчета регистров

Сообщение Anonymous »

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

Вот код C++ для простой тестовой программы:

Код: Выделить всё

#include 

int main()
{
std::vector vec(10000u);
std::fill(vec.begin(), vec.end(), 0);
for (unsigned i = 0u; i < vec.size(); ++i)
{
vec[i] = 5;
}

return 0;
}
И часть ассемблерного кода, созданного циклом for:

Код: Выделить всё

...
00007FF6A4521080  inc         edx
{
vec[i] = 5;
00007FF6A4521082  mov         dword ptr [rcx+rax*4],5
00007FF6A4521089  mov         eax,edx
00007FF6A452108B  cmp         rax,r9
00007FF6A452108E  jb          main+80h (07FF6A4521080h)
}
...
В программе вектор «vec» выделяется постоянным размером и заполняется нулями. Важная «работа» происходит в цикле for, где всем векторным переменным присваивается значение 5 (просто случайное значение).

Я хочу спросить, не вызывает ли этот ассемблерный код какие-то задержки в трубопроводе? Причина в том, что все инструкции каким-то образом коррелированы и работают в одних и тех же регистрах. Например, конвейеру придется подождать с инструкцией cmp rax r9, прежде чем mov eax, edx фактически присвоит значение eax/rax?

10000-кратный цикл — это то, где должно работать предсказание ветвей. Инструкция jb выполняет переход 10000 раз и только в конце она пройдет. Это означает, что предсказатель ветвей должен очень легко предсказывать, что переход произойдет в большинстве случаев. Однако с моей точки зрения такая оптимизация была бы бессмысленной, если бы код сам по себе тормозил внутри цикла.



Моя цель архитектура Skylake i5-6400

Подробнее здесь: https://stackoverflow.com/questions/522 ... alculation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»