Предположим, что у меня есть два указателя, которые указывают на несвязанные адреса, которые не кэшируются, поэтому при разыменовании они оба должны будут идти полностью из основной памяти.
int load_and_add(int *pA, int *pB)
{
int a = *pA; // will most likely miss in cache
int b = *pB; // will most likely miss in cache
// ... some code that does not use a or b
int c = a + b;
return c;
}
Если выполнение вне очереди позволяет выполнить код до вычисления значения c
, как будет происходить выборка значений a
и b
на современном процессоре Intel?
Полностью ли сериализован потенциально конвейерный доступ к памяти или может быть какое-то перекрытие выборки, выполняемое контроллером памяти ЦП?
Другими словами, если предположить, что обращение к основной памяти стоит 300 циклов. Будет ли выборка a
и b
стоить 600 циклов или выполнение вне очереди допускает некоторое возможное перекрытие и, возможно, будет стоить меньше циклов?