Это расширенный вопрос Как разрешить зависимость данных в массивах указателей? .
Сначала я приведу описание вопроса:
Если у нас есть массив целочисленных указателей, которые все указывают на один и тот же int, и l oop над ним выполняет операцию ++, это будет на 100% медленнее, чем указатели, указывающие на два разных целых числа.
Вот новая версия примера кода:
// Make sure it takes at least two cachelines
struct Cacheline {
int c[128]{};
};
int main() {
Cacheline d[4];
vector<int*> f;
f.resize(100000000);
// case 1 : counting over the same location
{
for (auto i = 0ul; i < f.size(); ++i) {
f[i] = d[i % 1].c;
}
/// this takes 200ms
for (auto i = 0ul; i < f.size(); ++i) {
++*f[i];
}
}
{
// case 2 : two locations interleaved
for (auto i = 0ul; i < f.size(); ++i) {
f[i] = d[i % 2].c;
}
/// this takes 100ms
for (auto i = 0ul; i < f.size(); ++i) {
++*f[i];
}
}
....
// three locations takes 90ms and four locations takes 85ms
}
Я понимаю, что выигрыш в производительности case 2
связан с тем, что запускается механизм выполнения вне очереди, и скрывает задержку зависимости данных. Я пытаюсь найти способ оптимизировать это в целом, используя выполнение OoO. Ожидаемый метод должен иметь незначительную стоимость предварительной обработки, так как мой пример использования против динамических c рабочих нагрузок.