С11/ С ++11 слабые тесты памяти

Может ли кто-нибудь указать на результаты сравнения производительности кода C11/C++11 с использованием упрощенных атомарных операций (особенно memory_order_release а также memory_order_acquire, но также memory_order_consume а также memory_order_relaxed) по умолчанию memory_order_seq_cst? Все архитектуры представляют интерес. Заранее спасибо.

3 ответа

Я провел небольшой сравнительный анализ ARMv7, см. https://github.com/reinhrst/ARMBarriers для отчета, слайды для моего выступления на EuroLLVM и код секвлока, который я использовал.

Короткая история: в коде seqlock функция Acquire/Release была примерно на 40% быстрее, чем последовательно согласованная версия.

Возможно, это не лучшее решение, но до сих пор я использовал CDSChecker для некоторых тестов в одном из моих проектов. Я еще не использовал его на полных программах, а больше только на независимых устройствах.

Для определенного куска кода (очереди на кражу работы) я нашел очень хорошую статью, в которой сравнивается версия C11 со слабой атомарностью, только с sc-atomics, оптимизированной вручную сборкой и неправильной версией с использованием полностью расслабленной атомики. (По стечению обстоятельств вышеупомянутая CDSChecker позже обнаружила ошибку в версии C11.) Подобные примеры приветствуются.

Вопрос как таковой не имеет смысла, и важно понять, почему.

Атомарная операция - это простая операция над скалярным объектом, за исключением того, что ее можно использовать для межпотокового взаимодействия; порядок влияет только на то, что гарантировано для других ячеек памяти.

[Примечание: стандартный текст формально не гарантирует этого, но он предназначен для гарантии этого, и на этом должен быть основан последовательный подход к семантике потоков C/C++.]

Вы можете сравнивать скорость умножения и косинуса, но не сравнивать стоимость вывода "hello world" и сброса cout. Сброс в потоке или файле не имеет внутренней цены: он относится к другим операциям.

Вы не можете сравнивать скорость операции, которая блокируется, пока какая-то предыдущая операция не будет завершена, с той, которая не выполняется.

Кроме того, вы не можете проводить тесты в вакууме. Нужна некоторая нагрузка, схема работы.

Вам нужно будет много узнать о современном дизайне ЦП, и под современным я подразумеваю все, что было изобретено за последние два десятилетия. Вы должны иметь хоть какое-то представление о сложности реального процессора и о том, как он запускает код, как работает многоядерный процессор, и об общих принципах кеширования памяти, чтобы даже мечтать о разработке полезного теста производительности абстрактно.

Или вы можете просто написать свою программу и профилировать ее, чтобы увидеть, действительно ли существует проблема с атомарными операциями.

Другие вопросы по тегам