优化了 还是卡
This commit is contained in:
@@ -66,6 +66,7 @@ private:
|
||||
std::atomic<tf::TaskType> active_task_type{tf::TaskType::UNDEFINED};
|
||||
std::atomic_uint64_t task_time_ns{};
|
||||
std::atomic_uint64_t busy_time_ns{};
|
||||
std::atomic_uint64_t cpu_time_ns{};
|
||||
std::atomic_uint64_t min_task_time_ns{std::numeric_limits<std::uint64_t>::max()};
|
||||
std::atomic_uint64_t max_task_time_ns{};
|
||||
};
|
||||
@@ -82,6 +83,7 @@ private:
|
||||
};
|
||||
std::vector<std::vector<Start_Record>> starts;
|
||||
std::vector<Clock::time_point> worker_busy_starts;
|
||||
std::vector<std::uint64_t> worker_cpu_starts;
|
||||
std::unique_ptr<Worker_Statistics[]> worker_statistics;
|
||||
std::size_t worker_statistics_count{};
|
||||
std::array<Task_Statistics, tf::TASK_TYPES.size()> task_types;
|
||||
@@ -99,6 +101,7 @@ private:
|
||||
std::atomic_size_t max_weak_dependencies{};
|
||||
std::atomic_uint64_t total_execution_time_ns{};
|
||||
std::atomic_uint64_t worker_busy_time_ns{};
|
||||
std::atomic_uint64_t worker_cpu_time_ns{};
|
||||
std::atomic_uint64_t first_task_time_ns{};
|
||||
std::atomic_uint64_t last_task_time_ns{};
|
||||
std::atomic_uint64_t longest_task_time_ns{};
|
||||
@@ -130,6 +133,7 @@ public:
|
||||
void set_up(std::size_t workers) override {
|
||||
starts.resize(workers);
|
||||
worker_busy_starts.resize(workers);
|
||||
worker_cpu_starts.resize(workers);
|
||||
worker_statistics = std::make_unique<Worker_Statistics[]>(workers);
|
||||
worker_statistics_count = workers;
|
||||
for (auto& worker : starts) worker.reserve(8);
|
||||
@@ -139,6 +143,7 @@ public:
|
||||
auto& worker_starts = starts[worker.id()];
|
||||
if (worker_starts.empty()) {
|
||||
worker_busy_starts[worker.id()] = now;
|
||||
worker_cpu_starts[worker.id()] = current_thread_cpu_ns();
|
||||
auto active = active_workers.fetch_add(1, std::memory_order_relaxed) + 1;
|
||||
update_max(peak_active_workers, active);
|
||||
}
|
||||
@@ -248,6 +253,11 @@ public:
|
||||
completed - worker_busy_starts[worker.id()]).count());
|
||||
worker_busy_time_ns.fetch_add(busy, std::memory_order_relaxed);
|
||||
worker_state.busy_time_ns.fetch_add(busy, std::memory_order_relaxed);
|
||||
const auto cpu_started = worker_cpu_starts[worker.id()];
|
||||
const auto cpu = cpu_completed_ns >= cpu_started
|
||||
? cpu_completed_ns - cpu_started : 0;
|
||||
worker_cpu_time_ns.fetch_add(cpu, std::memory_order_relaxed);
|
||||
worker_state.cpu_time_ns.fetch_add(cpu, std::memory_order_relaxed);
|
||||
active_workers.fetch_sub(1, std::memory_order_relaxed);
|
||||
worker_state.active_task_hash.store(0, std::memory_order_relaxed);
|
||||
worker_state.active_task_started_ns.store(0, std::memory_order_relaxed);
|
||||
@@ -300,10 +310,16 @@ public:
|
||||
state.max_weak_dependencies = max_weak_dependencies.load(std::memory_order_relaxed);
|
||||
state.total_task_time_ns = total_execution_time_ns.load(std::memory_order_relaxed);
|
||||
state.worker_busy_time_ns = worker_busy_time_ns.load(std::memory_order_relaxed);
|
||||
state.worker_cpu_time_ns = worker_cpu_time_ns.load(std::memory_order_relaxed);
|
||||
auto first = first_task_time_ns.load(std::memory_order_relaxed);
|
||||
auto last = last_task_time_ns.load(std::memory_order_relaxed);
|
||||
state.observed_wall_time_ns = first && last >= first ? last - first : 0;
|
||||
state.worker_utilization = workers && state.observed_wall_time_ns ? static_cast<double>(state.worker_busy_time_ns) * 100.0 / static_cast<double>(state.observed_wall_time_ns) / static_cast<double>(workers) : 0.0;
|
||||
state.worker_cpu_utilization = workers && state.observed_wall_time_ns
|
||||
? static_cast<double>(state.worker_cpu_time_ns) * 100.0 /
|
||||
static_cast<double>(state.observed_wall_time_ns) /
|
||||
static_cast<double>(workers)
|
||||
: 0.0;
|
||||
state.task_types.resize(task_types.size());
|
||||
for (std::size_t i = 0; i < task_types.size(); ++i) {
|
||||
const auto& source = task_types[i];
|
||||
@@ -335,11 +351,18 @@ public:
|
||||
? std::string(tf::to_string(active_type)) : std::string{};
|
||||
target.task_time_ns = source.task_time_ns.load(std::memory_order_relaxed);
|
||||
target.busy_time_ns = source.busy_time_ns.load(std::memory_order_relaxed);
|
||||
target.cpu_time_ns = source.cpu_time_ns.load(std::memory_order_relaxed);
|
||||
target.non_cpu_time_ns = target.busy_time_ns > target.cpu_time_ns
|
||||
? target.busy_time_ns - target.cpu_time_ns : 0;
|
||||
target.idle_time_ns = state.observed_wall_time_ns > target.busy_time_ns ? state.observed_wall_time_ns - target.busy_time_ns : 0;
|
||||
auto min = source.min_task_time_ns.load(std::memory_order_relaxed);
|
||||
target.min_task_time_ns = target.task_count ? min : 0;
|
||||
target.max_task_time_ns = source.max_task_time_ns.load(std::memory_order_relaxed);
|
||||
target.utilization = state.observed_wall_time_ns ? static_cast<double>(target.busy_time_ns) * 100.0 / static_cast<double>(state.observed_wall_time_ns) : 0.0;
|
||||
target.cpu_utilization = state.observed_wall_time_ns
|
||||
? static_cast<double>(target.cpu_time_ns) * 100.0 /
|
||||
static_cast<double>(state.observed_wall_time_ns)
|
||||
: 0.0;
|
||||
}
|
||||
state.longest_task_time_ns = longest_task_time_ns.load(std::memory_order_relaxed);
|
||||
state.longest_task_hash = longest_task_hash.load(std::memory_order_relaxed);
|
||||
|
||||
@@ -52,10 +52,13 @@ struct Task_Worker_State {
|
||||
std::string active_task_type{}; /* 当前任务的 Taskflow 原生 TaskType;空闲时为空。 */
|
||||
std::uint64_t task_time_ns{};
|
||||
std::uint64_t busy_time_ns{};
|
||||
std::uint64_t cpu_time_ns{}; /* Worker最外层任务活跃区间内累计的线程 CPU 时间。 */
|
||||
std::uint64_t non_cpu_time_ns{}; /* busy_time_ns 减去 cpu_time_ns;只表示未计费墙钟,不推断锁或抢占。 */
|
||||
std::uint64_t idle_time_ns{};
|
||||
std::uint64_t min_task_time_ns{};
|
||||
std::uint64_t max_task_time_ns{};
|
||||
double utilization{};
|
||||
double cpu_utilization{};
|
||||
bool operator==(const Task_Worker_State&) const = default;
|
||||
};
|
||||
/*
|
||||
@@ -87,8 +90,10 @@ struct Task_Runtime_State : State_Type<Task_Runtime_State_Tag> {
|
||||
std::uint64_t longest_task_time_ns{};
|
||||
std::uint64_t total_task_time_ns{};
|
||||
std::uint64_t worker_busy_time_ns{};
|
||||
std::uint64_t worker_cpu_time_ns{};
|
||||
std::uint64_t observed_wall_time_ns{};
|
||||
double worker_utilization{};
|
||||
double worker_cpu_utilization{};
|
||||
std::vector<Task_Type_State> task_types;
|
||||
std::vector<Task_Worker_State> workers;
|
||||
bool operator==(const Task_Runtime_State&) const = default;
|
||||
|
||||
Reference in New Issue
Block a user