ОПТИМИЗАЦИЯ ОПЕРАЦИЙ ПРОГРАММНОЙ ТРАНЗАКЦИОННОЙ ПАМЯТИ

1. Реализуемый в компьютерной системе, содержащей процессор и компилятор, сконфигурированный со знанием операций программной транзакционной памяти, способ компиляции программы, включающей в себя блоки программной транзакционной памяти, при этом способ содержит этапы, на которых:
оптимизируют (460) программу, чтобы создать оптимизированную программу, содержащую инструкции программной транзакционной памяти; и
компилируют (340) оптимизированную программу.
2. Способ по п.1, в котором оптимизация программы содержит этапы, на которых:
вставляют инструкции программной транзакционной памяти с прямым доступом в программу в блоках программной транзакционной памяти; и
выполняют оптимизации в отношении программы, включая инструкции программной транзакционной памяти, чтобы создать оптимизированную программу, так что, по меньшей мере, некоторые из этих оптимизаций сконфигурированы так, чтобы работать специально в отношении инструкций программной транзакционной памяти с прямым доступом.
3. Способ по п.2, в котором выполнение оптимизаций содержит этап, на котором выполняют процедуру общего исключения подвыражений, которая модифицирована так, чтобы работать в отношении декомпозированных инструкций программной транзакционной памяти.
4. Способ по п.3, в котором процедура общего исключения подвыражений модифицирована так, что инструкция открытия объекта для чтения исключается после инструкции открытия объекта для обновления в рамках той же транзакции
5. Способ по п.3, в котором процедура общего исключения подвыражений модифицирована так, что избыточные чтения и записи по адресам памяти и избыточные журналы для адресов памяти в рамках транзакции удаляются.
6. Способ по п.3, в котором процедура общего исключения подвыражений дополнительно модифицирована так, что чтения и записи в первой транзакции исключаются, если они сделаны избыточными посредством чтений и записей во второй транзакции, причем первая транзакция вложена во вторую транзакцию.
7. Способ по п.2, в котором выполнение оптимизаций содержит этап, на котором выполняют оптимизацию переноса части кода.
8. Способ по п.2, в котором выполнение оптимизаций содержит этап, на котором дополняют по меньшей мере одну операцию нетранзакционной памяти, которая осуществляет доступ к объекту вне транзакции памяти, одной или более операциями транзакционной памяти, которые обеспечивают атомарность между доступами транзакционной памяти к объекту и операцией нетранзакционной памяти.
9. Способ по п.8, в котором дополнение операции нетранзакционной памяти содержит этапы, на которых:
вставляют операцию открытия до операции нетранзакционной памяти, которая открывает объект для доступа посредством операции нетранзакционной памяти; и
вставляют операцию фиксации после операции нетранзакционной памяти, которая определяет, был ли конфликтующий доступ к объекту в ходе выполнения операции нетранзакционной памяти.
10. Способ по п.9, в котором:
операция нетранзакционной памяти - это операция считывания;
операция открытия сконфигурирована так, чтобы извлекать индикатор состояния объекта до выполнения операции нетранзакционной памяти; и
операция фиксации сконфигурирована так, чтобы:
извлекать индикатор состояния объекта после выполнения операции нетранзакционной памяти и
если состояние объекта указывает конфликтующий доступ, обуславливать выполнение операций открытия, чтения и фиксации в цикле до тех пор, пока чтение не станет возможным.
11. Способ по п.9, в котором:
операция нетранзакционной памяти - это операция записи;
операция открытия сконфигурирована так, чтобы получать доступ на запись в объект; и
операция фиксации сконфигурирована так, чтобы фиксировать запись, выполненную в объект.
12. Способ по п.9, в котором команды открытия и фиксации используют синхронизацию по объекту для того, чтобы обеспечивать то, чтобы операция нетранзакционной памяти выполнялась атомарно.
13. Способ по п.9, в котором команда открытия блокируется до тех пор, пока она не сможет открыть объект для доступа.
14. Способ по п.8, дополнительно содержащий этапы, на которых идентифицируют одну или более операций памяти, которые осуществляют доступ к объектам вне транзакций памяти.
15. Способ по п.14, в котором идентификация одной или более операций памяти содержит этапы, на которых:
анализируют доступы транзакционной памяти, чтобы определять поля, к которым может осуществляться доступ посредством операций транзакционной памяти в ходе исполнения программного обеспечения;
идентифицируют одну или более операций нетранзакционной памяти, которые осуществляют доступ к полям, к которым может осуществляться доступ посредством операций нетранзакционной памяти.
16. Способ по п.15, в котором для любого поля, к которому гарантированно не осуществляется доступ посредством операций транзакционной памяти, дополнение операций нетранзакционной памяти, которые осуществляют доступ к этому полю, исключается.
17. Способ по п.16, в котором дополнение операции нетранзакционной памяти, которая осуществляет доступ к объекту вне транзакции памяти одной или более операциями транзакционной памяти, содержит этап, на котором вставляют атомарные блоки транзакций памяти вокруг операции нетранзакционной памяти.
18. Способ по п.2, в котором выполнение оптимизаций содержит этапы, на которых:
идентифицируют ссылки на объекты, которые всегда привязываются к новым создаваемым объектам в транзакциях в наборе программных точек; и
предотвращают операции программной транзакционной памяти в отношении объектов, достигнутых посредством идентифицированных ссылок, причем эти операции не имеют эффекта вне транзакций.
19. Способ по п.18, в котором идентификация ссылок на объекты, которые всегда привязываются к новым создаваемым объектам в транзакциях в наборе программных точек, осуществляется в рамках вызовов процедур.
20. Способ по п.19, в котором идентификация ссылок на объекты, которые всегда привязываются к новым создаваемым объектам в транзакциях в наборе программных точек, содержит этап, на котором выполняют прямой анализ потоков данных в программе.
21. Способ по п.20, в котором прямой анализ потоков данных содержит этап, на котором сохраняют структуру данных для каждого базового блока, которая представляет в ячейке базового блока, для каждой переменной в базовом блоке, то известно ли, что переменная всегда должна выделяться новым создаваемым объектам, возможно может быть выделена объекту, созданному вне транзакции, либо что информация неизвестна для переменной.
22. Способ по п.21, в котором структура данных содержит привязку из каждой ссылки на данные, хранимые для каждой ссылки, при этом данные, хранимые для каждой ссылки, содержат обновляемую секцию, содержащую структурное значение и зависимости между ссылками.
23. Способ по п.22, в котором сохранение структуры данных содержит этап, на котором распространяют информацию, используя зависимости между ссылками, по обновляемым секциям структурных значений по мере того, как анализ потоков данных выполняется.
24. Способ по п.23, в котором распространение информации содержит этап, на котором распространяют информацию в непривязанные переменные в привязке от переменных к обновляемым секциям структурных значений, до того как операторы программы для этих непривязанных значений будут проанализированы.
25. Способ по п.18, в котором предотвращение операций программной транзакционной памяти в отношении объектов, достигнутых посредством идентифицированных ссылок, причем эти операции не имеют эффекта вне транзакций, содержит, для каждой ссылки, этап, на котором заменяют операции обновления по ссылке на операции обновления, которые, когда декомпозированы на декомпозированные операции программной транзакционной памяти, не включают в себя операции журнала обновлений.
26. Способ по п.18, в котором предотвращение операций программной транзакционной памяти в отношении объектов, достигнутых посредством идентифицированных ссылок, причем эти операции не имеют эффекта вне транзакций, содержит, после того как операции программной транзакционной памяти декомпозированы на декомпозированные операции программной транзакционной памяти, этап, на котором удаляют декомпозированные операции журнала, которые работают через идентифицированные ссылки.
27. Способ по п.18, дополнительно содержащий этап, на котором определяют то, какие из идентифицированных ссылок направлены на объекты, которые недоступны после транзакции; и
при этом предотвращение операций программной транзакционной памяти в отношении объектов, достигнутых посредством идентифицированных ссылок, причем эти операции не имеют эффекта вне транзакций, содержит этап, на котором удаляют операции программной транзакционной памяти, чтобы открыть объекты на чтение или обновление через идентифицированные ссылки.
28. Способ по п.2, в котором выполнение оптимизаций содержит этапы, на которых:
находят инструкцию программной транзакционной памяти для открытия ссылки для чтения, за которой, как известно, должна следовать первая инструкция программной транзакционной памяти для открытия ссылки для обновления в ходе исполнения; и
заменяют инструкцию для открытия ссылки для чтения на вторую инструкцию для открытия ссылки для обновления.
29. Способ по п.28, дополнительно содержащий этап, на котором удаляют первую инструкцию для открытия ссылки для обновления.
30. Способ по п.29, в котором удаление первой инструкции содержит этап, на котором используют общее исключение подвыражений, чтобы удалять избыточные инструкции, в том числе первую инструкцию.
31. Способ по п.28, в котором программное обеспечение представляется посредством графа управляющего процесса, и способ выполняется по этому графу управляющего процесса.
32. Способ по п.31, в котором нахождение инструкции для открытия ссылки для чтения, содержит, для базовых блоков на графе управляющего процесса, этапы, на которых:
идентифицируют инструкцию для открытия ссылки для чтения;
записывают эту ссылку;
сканируют вперед по базовому блоку от идентифицированной инструкции;
когда назначение ссылке обнаружено, прекращают сканирование идентифицированной инструкции; и
когда инструкция для открытия ссылки для обновления обнаружена, переходят к выполнению замены на идентифицированную инструкцию.
33. Способ по п.31, в котором нахождение инструкции для открытия ссылки для чтения содержит, для базовых блоков на графе управляющего процесса, этапы, на которых:
идентифицируют инструкцию для открытия ссылки для обновления;
записывают эту ссылку;
сканируют назад по базовому блоку от идентифицированной инструкции;
когда обнаружено назначение ссылке, прекращают сканирование идентифицированной инструкции; и
когда обнаружена инструкция для открытия ссылки для чтения, переходят к выполнению замены на обнаруженную инструкцию для открытия ссылки для чтения.
34. Способ по п.31, в котором нахождение инструкции для открытия ссылки для чтения содержит этап, на котором выполняют анализ потоков данных, при котором осуществляют поиск по границам базовых блоков инструкций для открытия ссылки для чтения, которые сделаны избыточными посредством инструкций для открытия ссылки для обновления.
35. Способ по п.34, в котором выполнение анализа потоков данных содержит этапы, на которых:
сохраняют набор переменных на границе каждого базового блока на графе управляющего процесса, которые, как известно, ссылаются на ссылки, которые открыты для обновления;
для каждого базового блока:
сканируют назад по графу управляющего процесса;
когда инструкция для открытия ссылки для обновления обнаружена для конкретной переменной, добавляют эту переменную в набор переменных для базового блока;
когда определение обнаружено для конкретной переменной, удаляют эту переменную из набора переменных для базового блока;
когда начало базового блока обнаружено, перекрещивают набор переменных для базового блока с наборами переменных, сохраненных в конце базовых блоков, которые приводят непосредственно к базовому блоку;
повторяют процесс до тех пор, пока стабильный набор переменных не будет создан для каждого базового блока; и
для каждого базового блока рассматривают инструкции для открытия ссылок, на которые ссылается набор переменных для базового блока, для чтения в качестве избыточных инструкций.
36. Способ по п.2, в котором выполнение оптимизаций содержит этапы, на которых:
идентифицируют одну или более процедур в программе, которые содержат одну или более операций программной транзакционной памяти, которые могут быть оптимизированы вне этих процедуры;
создают, для каждой из упомянутых одной или более процедур клонированную версию этой процедуры, которая допускает вызов операций программной транзакционной памяти, которые могут быть оптимизированы вне клонированной версии;
перемещают упомянутые одну или более операций программной транзакционной памяти, которые могут быть оптимизированы вне процедур; и
заменяют вызовы каждой из упомянутых одной или более процедур на вызовы ее клонированной версии.
37. Способ по п.36, дополнительно содержащий этап, на котором оптимизируют программу посредством удаления избыточностей среди упомянутых одной или более операций программной транзакционной памяти, которые могут быть оптимизированы.
38. Способ по п.37, в котором оптимизация программы содержит этап, на котором выполняют общее исключение подвыражений для программы.
39. Способ по п.37, в котором упомянутые одна или более операций программной транзакционной памяти, которые могут быть оптимизированы, содержат операции, чтобы получить менеджер транзакций.
40. Способ по п.39, в котором клонированные версии процедур, содержащие операции, чтобы получить менеджер транзакций, содержат процедуры, которые принимают экземпляры менеджера транзакций в качестве входных данных.
41. Способ по п.37, в котором упомянутые одна или более операций программной транзакционной памяти, которые могут быть оптимизированы, содержат операции, чтобы открыть ссылки для чтения или обновления, причем эти ссылки передаются в процедуры в качестве входных данных.
42. Способ по п.41, в котором клонированные версии процедур, содержащих операции, чтобы открыть ссылки для чтения или обновления, содержат процедуры, которые основываются на ссылках, открываемых до того, как вызываются процедуры.
43. Способ по п.42, в котором создание клонированных версий процедур, содержащих операции, чтобы открыть ссылки для чтения или обновления, содержит этап, на котором выполняют обратный анализ потоков данных, чтобы определять, какие процедуры содержат операции, чтобы открывать ссылки для чтения или обновления, которые известны в началах процедур.