Удивительный конфликт линии кэша прилегающих унаследованных членовC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Удивительный конфликт линии кэша прилегающих унаследованных членов

Сообщение Anonymous »

В critpath приложения с потоком я столкнулся с узким местом производительности. Профилирование указывает на неожиданное утверждение на линии кэша, несмотря на то, что кажется независимым доступом к данным в разных потоках. Учитывая следующий код: < /p>

Код: Выделить всё

#include 
#include 
#include 
#include 
#include 

struct Base
{
virtual ~Base() = default;
};

struct DerivedA : public Base
{
alignas(64) std::atomic counter_a{0};
};

struct DerivedB : public Base
{
alignas(64) std::atomic counter_b{0};
};

void increment_a(DerivedA* da, int iterations)
{
for (int i = 0; i < iterations; ++i)
{
da->counter_a.fetch_add(1, std::memory_order_relaxed);
}
}

void increment_b(DerivedB* db, int iterations)
{
for (int i = 0; i < iterations; ++i)
{
db->counter_b.fetch_add(1, std::memory_order_relaxed);
}
}

int main()
{
std::vector objects;
objects.emplace_back(std::make_unique());
objects.emplace_back(std::make_unique());

auto* derived_a = static_cast(objects[0].get());
auto* derived_b = static_cast(objects[1].get());

int iterations = 10'000'000;
std::thread t1(increment_a, derived_a, iterations);
std::thread t2(increment_b, derived_b, iterations);

t1.join();
t2.join();

std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/79581901/surprising-cache-line-contention-adjacent-inherited-members[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»