Quantcast
Channel: Блоги Intel® Developer Zone
Viewing all articles
Browse latest Browse all 106

Двоичная трансляция для задач симуляции. Часть 3. Оптимизации

$
0
0

Оптимизирующая трансляция

После того, как некоторый блок трансляции создан, может оказаться, что возможно преобразовать его так, чтобы он исполнялся быстрее, при этом сохранив его семантику; другими словами, провести оптимизирующую трансляцию. Этот процесс по смыслу аналогичен фазе оптимизаций обычного компилятора, позволяющей уменьшить время выполнения программ. Подчеркнём критически важное условие неизменности алгоритма фрагмента до и после преобразования. Если есть ненулевая вероятность того, что в каких-то случаях результат исполнения после применения определённой оптимизации будет отличаться от исходного, то её применять нельзя. 
На рис. 7 приведён пример часто используемой оптимизации некоторого блока трансляции с одной точкой входа и выхода [3] для некоторой архитектуры. Гостевой код состоит из пяти арифметических инструкций instr1 ...instr5 и инструкции branch. При трансляции капсулы отдельных инструкций (несущественное для данного объяснения содержимое капсул объединено и обозначено угловыми скобками) берутся последовательно друг за другом, формируя блок. При этом последняя машинная инструкция inc каждой из них предназначена для продвижения симулируемого регистра PC. 

Пример оптимизации результатов двоичной трансляции
Рис.7: Пример простой оптимизации кода блока трансляции. Инструкции inc продвижения регистра PC после каждой капсулы заменены одним сложением add в конце блока


Оптимизация в данном случае основана на том факте, что значение этого регистра PC на протяжении почти всего блока никто не читает, и неважно, изменилось оно или нет. Поэтому можно отложить все изменения до того момента, когда понадобится новое значение, т.е. до капсулы инструкции перехода <branch>. Следующий напрашивающийся шаг — использовать очевидное равенство и заменить пять инструкций сложения одной.
Как видно даже из столь простого примера, после оптимизации границы между исходными капсулами размываются, т.к. составляющие инструкции могут быть переставлены местами, заменены другими или вообще убраны.
Следующие типы оптимизаций, используемых в обычных компиляторах [11], применимы и при двоичной трансляции.

  • Удаление мёртвого кода (англ. dead code elimination) — нахождение команд, не влияющих на исполнение последующего кода. Вычисляемые ими значения не используются, поэтому и сами инструкции без вреда могут быть удалены. 
    Удаление общих подвыражений (англ. common subexpression elimination) — для вычислений, выполняемых более одного раза на рассматриваемом участке, второе и последующие их вхождения могут быть убраны и заменены уже вычисленным значением. 
    Свёртка констант (англ. constant folding) и дублирование констант (англ. constant propagation) — оптимизации для замены константных выражений и переменных на их значения, вычисленные при трансляции.
  • Анализ соседних инструкций (англ. peephole optimization) — класс оптимизаций, основанных на знании особенностей хозяйской архитектуры и стоимости выполнения инструкций. Например, две подряд идущие команды могут быть заменены на одну более быструю. 

Как правило, блоки трансляции не включают в себя циклы. По этой причине такие оптимизации, как раскрытие, слияние, инверсия циклов (англ. loop unrolling, loop fusion, loop inversion) и т.п., связанные с анализом потока управления, ограниченно доступны для задач симуляции.

Вынесение фазы трансляции в отдельный поток
В описанном выше алгоритме динамической двоичной трансляции её фазы: ДТ и собственно симуляция — чередуются, взаимно исключая исполнение друг друга. Однако осмысленным с точки зрения повышения производительности является вынесение процесса ДТ в отдельный хозяйский поток, исполняющийся параллельно с основным потоком, используемым для симуляции, и поставляющий для его нужд блоки трансляций [7].
Для сравнения на рис. 8 и 9 приведено соотношение этапов исполнения и ожидания для этих двух активностей в случае последовательной ДТ и ДТ, вынесенный в отдельный поток.


Рис.8: ДТ и симуляция выполняются последовательно


Рис.9: ДТ вынесена в отдельный поток


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

Литература
[1] Binary translation / Richard L. Sites, Anton Chernoff, Matthew B. Kirk et al. // Communications of the ACM. 1993. Vol. 36, no. 2. P. 69–81. 
[2] Chernoff Anton, Hookway Ray. DIGITAL FX!32 Running 32-Bit x86 Applications on Alpha NT // in Proceedings of the USENIX Windows NT Workshop, USENIX Association. 1997. P. 37–42.
[3] Fast Instruction Set Simulation Using LLVM-based Dynamic Translation / Claude Helmstetter, Vania Joloboff, Zhou Xinlei, Gao Xiaopeng // International MultiConference of Engineers and Computer Scientists 2011. Vol. 2188. Springer, 2011. P. 212-216. URL: http://hal.inria.fr/hal-00646947.
[4] Handbook of Floating-Point Arithmetic / Jean-Michel Muller, Nicolas Brisebarre, Florent de Dinechin et al. Birkhäuser Boston, 2010. 572 p. ACM G.1.0; G.1.2; G.4; B.2.0; B.2.4; F.2.1., ISBN 978-0-8176-4704-9. URL: http://perso.ens-lyon.fr/jean-michel.muller/Handbook.html.
[5] Hauser John. SoftFloat. 2010. >0pt . URL: http://www.jhauser.us/arithmetic/SoftFloat.html (online; accessed: 2013-02-08).
[6] IEEE Standard for Floating-Point Arithmetic. 2008. >0pt . IEEE Std 754-2008. URL: http://ieeexplore.ieee.org/xpl/mostRecentIssue.jsp?punumber=4610933.
[7] PQEMU: A Parallel System Emulator Based on QEMU / Jiun-Hung Ding, Po-Chun Chang, Wei-Chung Hsu, Yeh-Ching Chung // Proceedings of the 2011 IEEE 17th International Conference on Parallel and Distributed Systems. ICPADS '11. Washington, DC, USA : IEEE Computer Society, 2011. P. 276-283. URL: http://dx.doi.org/10.1109/ICPADS.2011.102.
[8] Seebach Peter. Unrolling AltiVec, Part 1: Introducing the PowerPC SIMD unit. 2005. URL: http://www.ibm.com/developerworks/power/library/pa-unrollav1.
[9] Smith James E., Nair Ravi. Virtual machines - Versatile Platforms for Systems and Processes. Elsevier, 2005. 638 p. ISBN: 978-1-55860-910-5.
[10] Topham Nigel, Jones Daniel. High speed CPU simulation using JIT binary translation // mobs. 2007. URL: http://homepages.inf.ed.ac.uk/npt/pubs/mobs-07.pdf.
[11] Компиляторы: принципы, технологии и инструментарий, 2 издание / Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Вильямс, 2008. 1184 p. ISBN: 978-5-8459-1349-4.


Viewing all articles
Browse latest Browse all 106

Trending Articles