Каков источник выбросов в этом тесте C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Каков источник выбросов в этом тесте C++?

Сообщение Anonymous »

Я запускаю этот код на C++, измеряя очень короткий интервал времени, необходимый для сложения двух чисел в Ubuntu 22.04. Меня не волнуют сами измерения, поскольку это неподходящий метод для измерения времени одной инструкции, но меня волнует повторяемость. Вот код:
int main() {
constexpr int n = 10'000'000;

vector timings;
int64_t result = 0;

timings.reserve(n+1);

for (int i = 0; i < n; i++) {
auto t0 = high_resolution_clock::now();
result += i;
auto t1 = high_resolution_clock::now();
timings.push_back(duration{t1-t0}.count());
}

sort(timings.begin(), timings.end());
println("\nmin: {:.3f}us med: {:.3f}us 99%: {:.3f}us max: {:.3f}us {}\n",
timings[0], timings[timings.size()/2], timings[99*timings.size()/100], timings.back(), result);

for (int i = timings.size()-9; i < timings.size(); i++)
println("{:.3f} ", timings);
}

Он производит:
min: 0.020us med: 0.020us 99%: 0.030us max: 181.702us 49999995000000

104.366
107.432
138.891
140.454
142.368
143.409
145.293
150.453
181.702

Существует множество выбросов, которые в 5 тысяч раз длиннее медианы. Каков их источник? Это накладные расходы на вызов high_solve_lock::now()? Переключение контекста ОС между вызовами high_solve_lock::now()?

Чтобы уточнить. Я не использую набор микробенчмаркинга, поскольку, как указано выше, меня не волнует, сколько времени займет результат += i. Это заполнитель для чего-то другого, что невозможно включить в этот пост. Меня волнуют только выбросы. Этот фрагмент кода показывает, что сам метод измерения дает выбросы, поэтому его необходимо улучшить. Мой вариант использования чувствителен к выбросам, и я хочу получить представление о наихудшем сценарии.
Я пытаюсь запустить тест с приоритетом в реальном времени, но у меня возникли проблемы с установкой это вверх. Запуск его как пользовательского процесса с максимальным приоритетом на выделенном ядре не удаляет выбросы.

Чтобы изолировать от активности ОС, я установил ядро ​​Ubuntu реального времени с pro Enable Realtime-Kernel и добавлен GRUB_CMDLINE_LINUX="nohz=on nohz_full=15 rcu_nocbs=15 isolcpus=15 irqaffinity=0-14" в grub. Я также вызываю sched_setaffinity() для ядра №15. Я запускаю итерации 1G и вижу гораздо меньшие выбросы:
1,000,000,000 iterations, PID 13232, NICE -20
min: 0.012us med: 0.020us 99%: 0.023us max: 13.731us 499999999500000000

7.636
9.137
9.760
12.583
13.145
13.240
13.585
13.682
13.731


Подробнее здесь: https://stackoverflow.com/questions/791 ... -benchmark
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»