Вот код 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;
}
Код: Выделить всё
...
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)
}
...
Я хочу спросить, не вызывает ли этот ассемблерный код какие-то задержки в трубопроводе? Причина в том, что все инструкции каким-то образом коррелированы и работают в одних и тех же регистрах. Например, конвейеру придется подождать с инструкцией cmp rax r9, прежде чем mov eax, edx фактически присвоит значение eax/rax?
10000-кратный цикл — это то, где должно работать предсказание ветвей. Инструкция jb выполняет переход 10000 раз и только в конце она пройдет. Это означает, что предсказатель ветвей должен очень легко предсказывать, что переход произойдет в большинстве случаев. Однако с моей точки зрения такая оптимизация была бы бессмысленной, если бы код сам по себе тормозил внутри цикла.
Моя цель архитектура Skylake i5-6400
Подробнее здесь: https://stackoverflow.com/questions/522 ... alculation
Мобильная версия