[flang-commits] [flang] [flang][runtime] Allow 1023 active asynchronous IDs (PR #82446)
via flang-commits
flang-commits at lists.llvm.org
Tue Feb 20 16:42:28 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-runtime
Author: Peter Klausler (klausler)
<details>
<summary>Changes</summary>
The present limit of 63 is too low for some tests; bump it up to 1023 by using an array of bit-sets.
---
Full diff: https://github.com/llvm/llvm-project/pull/82446.diff
2 Files Affected:
- (modified) flang/runtime/unit.cpp (+13-8)
- (modified) flang/runtime/unit.h (+7-3)
``````````diff
diff --git a/flang/runtime/unit.cpp b/flang/runtime/unit.cpp
index 58ca313d9e4454..09782d2f849278 100644
--- a/flang/runtime/unit.cpp
+++ b/flang/runtime/unit.cpp
@@ -1001,25 +1001,30 @@ int ExternalFileUnit::GetAsynchronousId(IoErrorHandler &handler) {
if (!mayAsynchronous()) {
handler.SignalError(IostatBadAsynchronous);
return -1;
- } else if (auto least{asyncIdAvailable_.LeastElement()}) {
- asyncIdAvailable_.reset(*least);
- return static_cast<int>(*least);
} else {
+ for (int j{0}; 64 * j < maxAsyncIds; ++j) {
+ if (auto least{asyncIdAvailable_[j].LeastElement()}) {
+ asyncIdAvailable_[j].reset(*least);
+ return 64 * j + static_cast<int>(*least);
+ }
+ }
handler.SignalError(IostatTooManyAsyncOps);
return -1;
}
}
bool ExternalFileUnit::Wait(int id) {
- if (static_cast<std::size_t>(id) >= asyncIdAvailable_.size() ||
- asyncIdAvailable_.test(id)) {
+ if (static_cast<std::size_t>(id) >= maxAsyncIds ||
+ asyncIdAvailable_[id / 64].test(id % 64)) {
return false;
} else {
if (id == 0) { // means "all IDs"
- asyncIdAvailable_.set();
- asyncIdAvailable_.reset(0);
+ for (int j{0}; 64 * j < maxAsyncIds; ++j) {
+ asyncIdAvailable_[j].set();
+ }
+ asyncIdAvailable_[0].reset(0);
} else {
- asyncIdAvailable_.set(id);
+ asyncIdAvailable_[id / 64].set(id % 64);
}
return true;
}
diff --git a/flang/runtime/unit.h b/flang/runtime/unit.h
index 140fda3c4d2a81..e3c8757645bb9e 100644
--- a/flang/runtime/unit.h
+++ b/flang/runtime/unit.h
@@ -36,10 +36,14 @@ class ExternalFileUnit : public ConnectionState,
public OpenFile,
public FileFrame<ExternalFileUnit> {
public:
+ static constexpr int maxAsyncIds{64 * 16};
+
explicit ExternalFileUnit(int unitNumber) : unitNumber_{unitNumber} {
isUTF8 = executionEnvironment.defaultUTF8;
- asyncIdAvailable_.set();
- asyncIdAvailable_.reset(0);
+ for (int j{0}; 64 * j < maxAsyncIds; ++j) {
+ asyncIdAvailable_[j].set();
+ }
+ asyncIdAvailable_[0].reset(0);
}
~ExternalFileUnit() {}
@@ -150,7 +154,7 @@ class ExternalFileUnit : public ConnectionState,
std::size_t recordOffsetInFrame_{0}; // of currentRecordNumber
bool swapEndianness_{false};
bool createdForInternalChildIo_{false};
- common::BitSet<64> asyncIdAvailable_;
+ common::BitSet<64> asyncIdAvailable_[maxAsyncIds / 64];
// When a synchronous I/O statement is in progress on this unit, holds its
// state.
``````````
</details>
https://github.com/llvm/llvm-project/pull/82446
More information about the flang-commits
mailing list