gloo/barrier.cc (18 lines of code) (raw):
/**
* Copyright (c) 2018-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree.
*/
#include "gloo/barrier.h"
namespace gloo {
BarrierOptions::BarrierOptions(const std::shared_ptr<Context>& context)
: context(context),
buffer(context->createUnboundBuffer(nullptr, 0)),
timeout(context->getTimeout()) {}
void barrier(BarrierOptions& opts) {
const auto& context = opts.context;
auto& buffer = opts.buffer;
const auto slot = Slot::build(kBarrierSlotPrefix, opts.tag);
// Below implements a dissemination barrier, described in "Two algorithms
// for barrier synchronization (1988)" by Hensgen, Finkel and Manber.
// PDF: https://www.inf.ed.ac.uk/teaching/courses/ppls/BarrierPaper.pdf
// DOI: 10.1007/BF01379320
// Instead of iterating over i up to log2(context->size), we immediately
// compute 2^i and compare with context->size.
for (size_t d = 1; d < context->size; d <<= 1) {
buffer->recv((context->size + context->rank - d) % context->size, slot);
buffer->send((context->size + context->rank + d) % context->size, slot);
buffer->waitRecv(opts.timeout);
buffer->waitSend(opts.timeout);
}
}
} // namespace gloo