#include #include #include #include class Baton { public: void post() { std::unique_lock l(lock_); done_ = true; cv_.notify_all(); } void wait() { std::unique_lock l(lock_); while (!done_) { cv_.wait(l); } } private: std::mutex lock_; std::condition_variable cv_; bool done_{false}; }; void AtLaunch_Base(int32_t numIters) { struct Helper { explicit Helper(int32_t lim) : limit_(lim) {} void operator()() { if (++val_ == limit_) { done.post(); } else { at::launch([this]() { (*this)(); }); } } int val_{0}; int limit_; Baton done; }; Helper h(numIters); auto start = std::chrono::system_clock::now(); h(); h.done.wait(); std::cout << "NoData " << static_cast( std::chrono::duration_cast( std::chrono::system_clock::now() - start) .count()) / static_cast(numIters) << " usec/each\n"; } void AtLaunch_WithData(int32_t numIters, int32_t vecSize) { struct Helper { explicit Helper(int32_t lim) : limit_(lim) {} void operator()(std::vector v) { if (++val_ == limit_) { done.post(); } else { at::launch([this, v = std::move(v)]() { (*this)(v); }); } } int val_{0}; int limit_; Baton done; }; Helper h(numIters); std::vector v(vecSize, 0); auto start = std::chrono::system_clock::now(); h(v); h.done.wait(); std::cout << "WithData(" << vecSize << "): " << static_cast( std::chrono::duration_cast( std::chrono::system_clock::now() - start) .count()) / static_cast(numIters) << " usec/each\n"; } int main(int argc, char** argv) { int32_t N = 1000000; AtLaunch_Base(N); AtLaunch_WithData(N, 0); AtLaunch_WithData(N, 4); AtLaunch_WithData(N, 256); return 0; }