Как оптимизировать производительность при подсчете массивов указателей? - PullRequest
3 голосов
/ 04 марта 2020

Это расширенный вопрос Как разрешить зависимость данных в массивах указателей? .

Сначала я приведу описание вопроса:

Если у нас есть массив целочисленных указателей, которые все указывают на один и тот же 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 рабочих нагрузок.

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