Skip to content

Commit

Permalink
[OpenMP][NFC] Put ExponentialBackoff in a Utils header (#73816)
Browse files Browse the repository at this point in the history
"private.h" will go.
  • Loading branch information
jdoerfert committed Nov 29, 2023
1 parent 5ce5ea3 commit b465f94
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 30 deletions.
52 changes: 52 additions & 0 deletions openmp/libomptarget/include/Utils/ExponentialBackoff.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
//===-- Utils/ExponentialBackoff.h - Heuristic helper class ------*- C++ -*===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Implement exponential backoff counting.
// Linearly increments until given maximum, exponentially decrements based on
// given backoff factor.
//
//===----------------------------------------------------------------------===//

#ifndef OMPTARGET_UTILS_EXPONENTIAL_BACKOFF_H
#define OMPTARGET_UTILS_EXPONENTIAL_BACKOFF_H

#include <cassert>
#include <cmath>
#include <cstdint>

namespace utils {

class ExponentialBackoff {
int64_t Count = 0;
const int64_t MaxCount = 0;
const int64_t CountThreshold = 0;
const double BackoffFactor = 0;

public:
ExponentialBackoff(int64_t MaxCount, int64_t CountThreshold,
double BackoffFactor)
: MaxCount(MaxCount), CountThreshold(CountThreshold),
BackoffFactor(BackoffFactor) {
assert(MaxCount >= 0 &&
"ExponentialBackoff: maximum count value should be non-negative");
assert(CountThreshold >= 0 &&
"ExponentialBackoff: count threshold value should be non-negative");
assert(BackoffFactor >= 0 && BackoffFactor < 1 &&
"ExponentialBackoff: backoff factor should be in [0, 1) interval");
}

void increment() { Count = std::min(Count + 1, MaxCount); }

void decrement() { Count *= BackoffFactor; }

bool isAboveThreshold() const { return Count > CountThreshold; }
};

} // namespace utils

#endif // OMPTARGET_UTILS_EXPONENTIAL_BACKOFF_H
4 changes: 3 additions & 1 deletion openmp/libomptarget/src/interface.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
#include "Shared/Profile.h"
#include "Shared/Utils.h"

#include "Utils/ExponentialBackoff.h"

#include <cassert>
#include <cstdint>
#include <cstdio>
Expand Down Expand Up @@ -452,7 +454,7 @@ EXTERN void __tgt_target_nowait_query(void **AsyncHandle) {
// completed (use device side blocking mechanism). This allows the runtime to
// adapt itself when there are a lot of long-running target regions in-flight.
using namespace llvm::omp::target;
static thread_local ExponentialBackoff QueryCounter(
static thread_local utils::ExponentialBackoff QueryCounter(
Int64Envar("OMPTARGET_QUERY_COUNT_MAX", 10),
Int64Envar("OMPTARGET_QUERY_COUNT_THRESHOLD", 5),
Envar<float>("OMPTARGET_QUERY_COUNT_BACKOFF_FACTOR", 0.5f));
Expand Down
29 changes: 0 additions & 29 deletions openmp/libomptarget/src/private.h
Original file line number Diff line number Diff line change
Expand Up @@ -382,33 +382,4 @@ class TaskAsyncInfoWrapperTy {
operator AsyncInfoTy &() { return *AsyncInfo; }
};

// Implement exponential backoff counting.
// Linearly increments until given maximum, exponentially decrements based on
// given backoff factor.
class ExponentialBackoff {
int64_t Count = 0;
const int64_t MaxCount = 0;
const int64_t CountThreshold = 0;
const float BackoffFactor = 0.0f;

public:
ExponentialBackoff(int64_t MaxCount, int64_t CountThreshold,
float BackoffFactor)
: MaxCount(MaxCount), CountThreshold(CountThreshold),
BackoffFactor(BackoffFactor) {
assert(MaxCount >= 0 &&
"ExponentialBackoff: maximum count value should be non-negative");
assert(CountThreshold >= 0 &&
"ExponentialBackoff: count threshold value should be non-negative");
assert(BackoffFactor >= 0 && BackoffFactor < 1 &&
"ExponentialBackoff: backoff factor should be in [0, 1) interval");
}

void increment() { Count = std::min(Count + 1, MaxCount); }

void decrement() { Count *= BackoffFactor; }

bool isAboveThreshold() const { return Count > CountThreshold; }
};

#endif

0 comments on commit b465f94

Please sign in to comment.