1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #include <algorithm>
- #include <atomic>
- #include <cmath>
- #include <condition_variable>
- #include <memory>
- #include <mutex>
- #include <tuple>
- #include "ceres/internal/config.h"
- #include "ceres/parallel_for.h"
- #include "ceres/parallel_vector_ops.h"
- #include "glog/logging.h"
- namespace ceres::internal {
- BlockUntilFinished::BlockUntilFinished(int num_total_jobs)
- : num_total_jobs_finished_(0), num_total_jobs_(num_total_jobs) {}
- void BlockUntilFinished::Finished(int num_jobs_finished) {
- if (num_jobs_finished == 0) return;
- std::lock_guard<std::mutex> lock(mutex_);
- num_total_jobs_finished_ += num_jobs_finished;
- CHECK_LE(num_total_jobs_finished_, num_total_jobs_);
- if (num_total_jobs_finished_ == num_total_jobs_) {
- condition_.notify_one();
- }
- }
- void BlockUntilFinished::Block() {
- std::unique_lock<std::mutex> lock(mutex_);
- condition_.wait(
- lock, [this]() { return num_total_jobs_finished_ == num_total_jobs_; });
- }
- ParallelInvokeState::ParallelInvokeState(int start,
- int end,
- int num_work_blocks)
- : start(start),
- end(end),
- num_work_blocks(num_work_blocks),
- base_block_size((end - start) / num_work_blocks),
- num_base_p1_sized_blocks((end - start) % num_work_blocks),
- block_id(0),
- thread_id(0),
- block_until_finished(num_work_blocks) {}
- }
|