Cache Coherency: Packed vs Padded Thread Counters

Question 12 / 51 Correct so far: 0 (0 answered)

Snippet A

Packed Counters

struct Counters {
    std::atomic<long long> a{0};
    std::atomic<long long> b{0};
};

auto& counter = isThreadA ? g_counters.a : g_counters.b;

counter.fetch_add(1, std::memory_order_relaxed);
Snippet B

Padded Counters

struct alignas(kCacheLineBytes) PaddedCounter {
    std::atomic<long long> value{0};
};
struct Counters {
    PaddedCounter a;
    PaddedCounter b;
};

auto& counter = isThreadA ? g_counters.a.value : g_counters.b.value;

counter.fetch_add(1, std::memory_order_relaxed);
Shared test data (shared-setup)
static constexpr std::size_t kCacheLineBytes = 64;

Which snippet is faster?

Select the correct answer(s)