Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -319,12 +319,19 @@ class L2Cache : public simdojo::Component {

static constexpr uint64_t MAX_INVALIDATE_RANGE_SET_LOCKS = 64;

std::mutex &set_mutex(uint64_t addr) const { return set_mutexes_[CacheStore::set_index(addr)]; }
// Different sets can be accessed concurrently without sharing a host cache line.
struct alignas(64) SetMutex {
std::mutex mutex;
};
using SetMutexes = std::array<SetMutex, NUM_SETS>;

std::mutex &set_mutex(uint64_t addr) const {
return set_mutexes_[CacheStore::set_index(addr)].mutex;
}

class SetRangeLocks {
public:
SetRangeLocks(std::array<std::mutex, NUM_SETS> &mutexes, uint64_t line_start,
uint64_t line_count)
SetRangeLocks(SetMutexes &mutexes, uint64_t line_start, uint64_t line_count)
: mutexes_(mutexes) {
std::array<bool, NUM_SETS> seen{};
for (uint64_t i = 0; i < line_count; ++i) {
Expand All @@ -339,7 +346,7 @@ class L2Cache : public simdojo::Component {
std::ranges::sort(sets_.begin(), sets_.begin() + count_);
try {
for (size_t i = 0; i < count_; ++i) {
mutexes_[sets_[i]].lock();
mutexes_[sets_[i]].mutex.lock();
++locked_;
}
} catch (...) {
Expand All @@ -357,11 +364,11 @@ class L2Cache : public simdojo::Component {
void unlock_all() {
while (locked_ > 0) {
--locked_;
mutexes_[sets_[locked_]].unlock();
mutexes_[sets_[locked_]].mutex.unlock();
}
}

std::array<std::mutex, NUM_SETS> &mutexes_;
SetMutexes &mutexes_;
std::array<uint32_t, NUM_SETS> sets_{};
size_t count_ = 0;
size_t locked_ = 0;
Expand Down Expand Up @@ -405,7 +412,7 @@ class L2Cache : public simdojo::Component {
CacheStore cache_;
mutable MaintenanceMutex maintenance_mutex_;
std::mutex epoch_reconcile_mutex_;
mutable std::array<std::mutex, NUM_SETS> set_mutexes_;
mutable SetMutexes set_mutexes_;
simdojo::Port *req_port_ = nullptr;
GpuMemory *backing_memory_ = nullptr; ///< Direct writeback path (functional mode).
GpuMemory *legacy_maintenance_memory_ = nullptr;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,8 @@ class SparseMemory : public Component {
private:
static constexpr size_t NUM_PAGE_STRIPES = 1024;

struct PageStripe {
// Keep concurrent readers of neighboring stripes off the same host cache line.
struct alignas(64) PageStripe {
mutable std::shared_mutex mutex;
mutable std::unordered_map<uint64_t, Page> pages;
};
Expand Down
Loading