Повышение производительности при использовании volatile для setjmp / longjmp - PullRequest
3 голосов
/ 03 ноября 2011

Для работы setjmp / longjmp необходимо объявить локальные переменные как volatile.Если кто-то компилирует свой код с параметром -O3, насколько сильно будут влиять изменчивые переменные на производительность.Будет ли это много или мало для многоядерной платформы x86?

По моему мнению, это только добавило бы крошечные накладные расходы, потому что эта переменная переменная все еще может быть кэширована и чтение / запись из кэша в любом случае довольно быстрая.Мнения?

Ответы [ 2 ]

5 голосов
/ 03 ноября 2011

Кстати, семантика volatile зависит от платформы / компилятора. В некоторых компиляторах, таких как MSVC с архитектурой IA64, ключевое слово volatile не только запрещает компилятору переупорядочивать операции, оно также выполняет каждую операцию чтения / записи с семантикой получения / выпуска, то есть в действительности существует операция с барьером памяти. GCC, с другой стороны, не позволяет компилятору переупорядочивать операции до / после чтения / записи в энергозависимую область памяти ... на платформах с моделями со слабой памятью семантика захвата-выпуска не поддерживается, как с MSVC.

Теперь на x86, из-за его модели памяти со строгим упорядочением, наличие барьеров памяти при использовании ключевого слова volatile не является проблемой, поэтому основным наказанием будет просто отсутствие переупорядочения и другие оптимизации, которые могут быть выполнены компилятором. Тем не менее, это будет зависеть от того, как выглядит ваш код. Например, если в вашем коде имеется замкнутый цикл, а определенные volatile -качественные переменные на самом деле являются инвариантами цикла, вы не получите некоторые из оптимизаций, которые мог бы выполнить компилятор, если бы эти области памяти были определены как не-volatile.

2 голосов
/ 03 ноября 2011

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

Кажется, что на практике никто не хочет поддерживатькод, в котором все переменные должны быть volatile.Это означает, что функция, содержащая setjmp, вероятно, будет небольшой, возможно, содержит только setjmp.В этом случае volatile переменных будет мало или не будет, и их «влияние» должно быть действительно небольшим.

...