С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
. Сброс в потоке или файле не имеет внутренней цены: он относится к другим операциям.
Вы не можете сравнивать скорость операции, которая блокируется, пока какая-то предыдущая операция не будет завершена, с той, которая не выполняется.
Кроме того, вы не можете проводить тесты в вакууме. Нужна некоторая нагрузка, схема работы.
Вам нужно будет много узнать о современном дизайне ЦП, и под современным я подразумеваю все, что было изобретено за последние два десятилетия. Вы должны иметь хоть какое-то представление о сложности реального процессора и о том, как он запускает код, как работает многоядерный процессор, и об общих принципах кеширования памяти, чтобы даже мечтать о разработке полезного теста производительности абстрактно.
Или вы можете просто написать свою программу и профилировать ее, чтобы увидеть, действительно ли существует проблема с атомарными операциями.