Введение 4
Постановка задачи 7
Обзор 8
Глава 1. Теорема о корректности компиляции 25
1.1. Схема доказательства теоремы 26
1.2. Пример построения структуры событий 28
Глава 2. Симуляция обхода графа IMM 31
2.1. Обход графа IMM 31
2.2. Отношение симуляции 33
2.3. Шаг симуляции 36
Заключение 43
Список литературы 44
Современные мультипроцессоры и компиляторы высокоуровневых языков программирования выполняют множество оптимизаций при исполнении и компиляции программ соответственно с целью повышения производительности конечного кода. В случае многопоточных программ применение этих оптимизаций может привести к неожиданным сценариям поведения. Рассмотрим, например, программу LB-nodep, представленную ниже1.
а := x II1
b := у Ц1
а := x II1
b := у Ц1
a := x II1
b := у Ц1
У := 1
x := b
у := 1 + а * 0
x := b
У := a
x := b
(LB-nodep)
(LB-fakedep)
(LB-dep)
При сборке программы оптимизирующий компилятор может выполнить переупорядочивание инструкций a := x и у := 1 в левом потоке, так как данные инструкции независимы. Тем не менее, при исполнении в многопоточной среде эффект от применения данной оптимизации может наблюдаться другими потоками. Например, в случае LB-nodep это может привести к сценарию исполнения программы, при котором обе локальные переменные а и b будут содержать значение 1. Подобные сценарии известны как слабые сценарии поведения (weak behaviors).
Моделью памяти (memory model) принято называть семантику многопоточных программ, оперирующих с разделяемой памятью [1]. Слабые модели памяти (weak memory models) призваны описать поведение многопоточных программ с учетом слабых сценариев поведения. Основной исследовательской проблемой в данной области является формальное определение модели памяти, которая с одной стороны позволяла бы описывать эффекты от применения широкого класса оптимизаций, в частности, переупорядочивание независимых инструкций чтения и записи (load-to-store reordering) и распространение констант (constant propagation), а с другой стороны запрещала бы появление так называемых значений из воздуха (out-of-thin-air values) [1, 2].
Данную проблему можно продемонстрировать на примере программ LB-nodep, LB-fakedep и LB-dep. Желаемая модель памяти должны допускать сценарий поведения, при котором в результате справедливо, что a = b = 1, для программ LB-nodep и LB-fakedep, но не для программы LB-dep. В случае LB-nodep данный результат может быть обоснован переупорядочиванием независимых инструкций чтения и записи в левом потоке. В случае LB-fakedep тот же результат может быть получен после применения распространения констант и упрощения подвыражения у := 1 + a * 0 до у := 1, а затем перестановки инструкций. В случае LB-dep сценарий поведения, при котором в результате получаем a = b = 1, не может быть обоснован никакой комбинацией разумных оптимизаций. Значение 1 в данном случае появляется “из воздуха”.
Предъявленные выше требования, то есть поддержка широкого класса оптимизаций и запрещение значений из воздуха, являются критическими для моделей памяти высокопроизводительных языков программирования, таких как C/C++ [3], Java [4], или языка промежуточного представления LLVM (LLVMIR) [5]. Среди нескольких кандидатов [6, 7, 8], удовлетворяющих данным требованиям, в контексте данной работы нас будет интересовать модель Weakestmo [9], основанная на теории структур событий [10]. К её достоинствам можно отнести декларативность и поддержку всего спектра возможностей модели памяти C/C++ [3]. Тем не менее, у данной модели существуют и недостатки. В частности, ранее для данной модели не была доказана корректность оптимальной схемы компиляции для моделей памяти современных мультипроцессоров, таких как x86 [11], ARM [12] и POWER [13].
Корректность оптимальной схемы компиляции для моделей мультипроцессоров является ещё одним критический важным требованием, предъявляемым к моделям памяти высокопроизводительных языков программирования [1]. Оно необходимо для того, чтобы гарантировать, что при компиляции инструкций обращения к разделяемым переменным из языка программирования в инструкции целевого процессора не требовалось вставлять специальные инструкции — барьеры памяти (memory barriers или memory fences) [14], которые могут снижать производительность кода, и при этом программа оставалась корректной.
В данной работе исправляется данный недостаток. А именно, представлено доказательство корректности компиляции из модели Weakestmo в модели современных мультипроцессоров x86, ARM и POWER, формализованное с помощью системы для интерактивного доказательства теорем Coq2 [15]. Предложенное доказательство использует промежуточную модель памяти (intermediate memory model, IMM) [16], предоставляющую удобную абстракцию над моделями x86, ARM и POWER, в качестве промежуточного звена между моделью Weakestmo и моделями мультипроцессоров. Поскольку корректность компиляции из модели IMM в модели x86, ARM и POWER уже была показана ранее в работе [16], остается лишь доказать корректность компиляции из модели Weakestmo в модель IMM (корректность компиляции из Weakestmo в модели x86, ARM и POWER получается по транзитивности).
Основной сложностью доказательства является то, что модели Weakestmo и IMM заданы в разных стилях. Модель IMM разрешает спекулятивное исполнение инструкций вне очереди, но при этом отслеживает синтаксические зависимости между инструкциями, чтобы запретить появление циклов причинноследственной связи. С другой стороны, модель Weakestmo исполняет инструкции по порядку, но рассматривает единовременно несколько сценариев исполнения объединенных в структуру событий, некоторые из этих сценариев исполнения моделируют спекулятивное исполнение инструкций вне очереди. С помощью метода симуляции [17] демонстрируется, что построение необходимой структуры событий может симулировать процесс исполнения программы в модели IMM.
В рамках данной работы была доказана теорема о корректности компиляции из модели памяти для языков программирования Weakestmo в модели памяти современных мультипроцессоров x86, ARM и POWER. Модель Weakestmo и доказательство о корректности компиляции были формализованы с помощью системы для интерактивного доказательства теорем Coq. По результатам данной работы в соавторстве с коллегами была опубликована статья [24] и подготовлен доклад на конференции European Conference on Object-Oriented Programming (ECOOP) 2020.
В дальнейшем планируется продолжить развитие модели Weakestmo и ее формализации в системе Coq. Также ведется работа по разработке алгоритма проверки моделей (model checking) для автоматической верификации многопоточных программ в модели памяти Weakestmo.
[1] Moiseenko E, Podkopaev A, Koznov D. A Survey of Programming Language Memory Models // Programming and Computer Software. — 2021. — Vol. 47, no. 6.-P. 439-456.
[2] The Problem of Programming Language Concurrency Semantics / Mark Batty, Kayvan Memarian, Kyndylan Nienhuis et al. // ESOP. — Vol. 9032 of LNCS. - Springer, 2015. - P. 283-307.
[3] Mathematizing C++ Concurrency / Mark Batty, Scott Owens, Susmit Sarkar et al. // POPL 2011. - ACM, 2011. - P. 55-66.
[4] Manson Jeremy, Pugh William, Adve Sarita V. The Java Memory Model // POPL 2005. - ACM, 2005. - P. 378-391.
[5] Chakraborty Soham, Vafeiadis Viktor. Formalizing the concurrency semantics of an LLVM fragment // 2017 IEEE/ACM International Symposium on Code Generation and Optimization (CGO) / IEEE. — 2017. — P. 100-110.
[6] A Promising Semantics for Relaxed-Memory Concurrency / Jeehoon Kang, Chung-Kil Hur, Ori Lahav et al. // POPL 2017. - ACM, 2017.
[7] Modular Relaxed Dependencies in Weak Memory Concurrency / Marco Paviotti, Simon Cooksey, Anouk Paradis et al. // European Symposium on Programming / Springer, Cham. — 2020. — P. 599-625.
[8] Jagadeesan Radha, Jeffrey Alan, Riely James. Pomsets with preconditions: a simple model of relaxed memory // Proceedings of the ACM on Programming Languages. — 2020. — Vol. 4, no. OOPSLA. — P. 1-30.
[9] Chakraborty Soham, Vafeiadis Viktor. Grounding thin-air reads with event structures // Proceedings of the ACM on Programming Languages. — 2019. - Vol. 3, no. POPL. -P. 1-28.
[10] Winskel Glynn. Event structures // Advanced Course on Petri Nets / Springer. — 1986. — P. 325-392.
[11] x86-TSO: A Rigorous and Usable Programmer’s Model for x86 Multiprocessors / Peter Sewell, Susmit Sarkar, Scott Owens et al. // Commun. ACM. — 2010.-Vol. 53, no. 7.-P. 89-97.
[12] Simplifying ARM concurrency: multicopy-atomic axiomatic and operational models for ARMv8 / Christopher Pulte, Shaked Flur, Will Deacon et al. // Proceedings of the ACM on Programming Languages. — 2018. — Vol. 2, no. POPL.-P. 1-29.
[13] Alglave Jade, Maranget Luc, Tautschnig Michael. Herding Cats: Modelling, Simulation, Testing, and Data Mining for Weak Memory // ACM Trans. Program. Lang. Syst.— 2014.— Vol. 36, no. 2. — P. 7:1-7:74.
[14] McKenney Paul E. Memory barriers: a hardware view for software hackers // Linux Technology Center, IBM Beaverton. — 2010.
[15] The Coq Development Team. The Coq Proof Assistant. — 2021. — Jan. — Access mode: https://doi.org/10.5281/zenodo.4501022.
...