Есть ли способ измерить задержку нескольких нагрузок параллельно в x86 (используя RDTSCP или RDTS C), без сериализации? - PullRequest
0 голосов
/ 29 января 2020

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

Проблема в том, что любая попытка измерить задержку нагрузки сериализует ее относительно других нагрузок.

Возьмем, например, наивно написанный код, который измеряет задержку двух загрузок:

1. rdtscp
2. load-1
3. rdtscp

4. rdtscp 
5. load-2
6. rdtscp

В приведенном выше коде свойство упорядочения rdtscp в Intel x86 сериализует выполнение load-1 и load-2 в соответствии с моим тестированием (т. е. load -2 выдается в систему памяти только после завершения загрузки 1). В результате вышеприведенный код не использует доступную пропускную способность памяти. В идеале я хотел бы обеспечить максимальную пропускную способность для нагрузок при одновременном измерении задержки каждой нагрузки.

Существует ли способ измерения задержки нагрузки 1 и 2, одновременно позволяя чтобы они выполнялись параллельно?

В идеале мне нужна форма rdtscp, упорядоченная по отношению к нагрузке, задержка которой измеряется, и не упорядоченная явно с какой-либо другой инструкцией. Мне было интересно, есть ли способ получить это либо с помощью rdtscp или rdts c.

1 Ответ

1 голос
/ 29 января 2020

Я не думаю, что есть какой-либо способ выборки времени с зависимостью ввода для определенного регистра c или какой-либо другой способ, позволяющий завершить загрузку не по порядку, но все же время для каждого по отдельности. Или даже просто позволить им перекрываться.


Существуют перф события для mem_trans_retired.load_latency_gt_32 и так далее для степеней 2 от 4 до 512. Вы можете запрограммировать счетчики и rdpmc для этого. Но он не скажет вам, какая загрузка вызвала какое событие.

Учитывая вашу общую цель, вы можете использовать эти счетчики с perf stat или perf record, чтобы получить среднее значение для всего случая l oop, когда (одноядерная) максимальная пропускная способность памяти.

Обратите внимание, что они учитывают задержку от первой отправки (до порта загрузки), а не выдаются на серверную часть.

...