Предположим, у меня есть много вычислений, которые я хочу выполнить (и оценить время процессора) в нескольких потоках.В качестве игрушечного примера:
#include <chrono>
#include <future>
#include <iostream>
#include <vector>
using unit_t = std::chrono::nanoseconds;
unit_t::rep expensive_computation() {
auto start = std::chrono::steady_clock::now();
// Something time-consuming here...
auto end = std::chrono::steady_clock::now();
auto duration = std::chrono::duration_cast<unit_t>(end - start).count();
return duration;
}
int main() {
std::vector<std::future<unit_t::rep>> computations;
for (int i = 0; i < 100; i++) {
computations.push_back(std::async(expensive_computation));
}
for (size_t i = 0; i < computations.size(); i++) {
auto duration = computations[i].get();
std::cout << "#" << i << " took " << duration << "ns" << std::endl;
}
}
Я обеспокоен тем, что, поскольку steady_clock
является монотонным в потоках базовые такты для каждого процесса, а не для потока (если запланирован какой-либо поток,такты для всех потоков).Это будет означать, что если бы поток спал, steady_clock
все равно работал бы для него, и это время было бы неправильно включено в duration
для этого потока.Правильно ли мое подозрение?Или steady_clock
ставит галочку только для процессорного времени потока внутри потока?
Другими словами, является ли этот подход безопасным способом независимо рассчитать время большого количества вычислений (таким образом, что время, потраченное ЦП на один поток, не повлияет наduration
из другой темы)?Или мне нужно выделять отдельные процессы для каждого вычисления, чтобы сделать отметку steady_clock
only, когда вычисление выполняется / запланировано?
edit: Я также признаю, что ускорение большего количества потоковчем ядра могут быть неэффективным подходом к этой проблеме (хотя я не особо беспокоюсь о пропускной способности вычислений; более того, я просто хочу, чтобы все они как группа завершили в самое быстрое время).Я подозреваю, что на практике мне нужно было бы поддерживать ограниченный список потоков с небольшими константами в полете (скажем, ограниченный числом ядер) и только начинать новые вычисления, когда ядро становится доступным.Но это не должно влиять на сроки, о которых я забочусь выше;это должно влиять только на время настенных часов.