add pass REMOVE_DIST_ARRAYS_FROM_IO, make copyArray fuction from resolve_par_regions public #53

Merged
Alexander_KS merged 4 commits from replace_dist_arrays_in_io into master 2024-11-14 06:19:28 +00:00
Collaborator

Новый проход для подмены обращений к распределённым массивам на ввод/вывод.

Как написано в документации, распределённые массивы можно вводить-выводить только если 1) форматная строка = * 2) вводится/выводится массив целиком и только он один, поэтому создание массивов-копий триггерят только операторы, не удовлетворяющие 1) или 2).

Алгоритм написан так, чтобы:

  • между последовательными плохими операциями ввода-вывода не было лишних копирований
  • также между ними могут быть некоторые операторы (все, кроме: вызовов функций/процедур [TODO: пока не обрабатываются функции, вызываемые при вычислении выражений], циклы)
  • операции копирования ставятся так, чтобы охватить максимвально возможную часть, чтобы избежать лишних копирований при группе операций ввода-вывода, поэтому, если можно, копирование выносится вверх по областям видимости насколько это возможно

Для копирования массивов использовал функцию из RESOLVE_PAR_REGIONS
Для вставки копирования массивов это сделать не получилось, потому что она не работает в случае если между операциями копирования всего оператор

Новый проход для подмены обращений к распределённым массивам на ввод/вывод. Как написано в документации, распределённые массивы можно вводить-выводить только если 1) форматная строка = * 2) вводится/выводится массив целиком и только он один, поэтому создание массивов-копий триггерят только операторы, не удовлетворяющие 1) или 2). Алгоритм написан так, чтобы: * между последовательными *плохими* операциями ввода-вывода не было лишних копирований * также между ними могут быть некоторые операторы (все, кроме: вызовов функций/процедур [TODO: пока не обрабатываются функции, вызываемые при вычислении выражений], циклы) * операции копирования ставятся так, чтобы охватить максимвально возможную часть, чтобы избежать лишних копирований при группе операций ввода-вывода, поэтому, если можно, копирование выносится вверх по областям видимости насколько это возможно Для копирования массивов использовал функцию из RESOLVE_PAR_REGIONS Для вставки копирования массивов это сделать не получилось, потому что она *не работает* в случае если между операциями копирования всего оператор
xnpster added 1 commit 2024-10-16 20:42:05 +00:00
xnpster added 1 commit 2024-10-30 21:03:47 +00:00
Author
Collaborator

Добавил проверку на то, есть ли между операциями копирования между оригинальными массивами и копиями операторы записи/чтения. На основе этого ненужные операции копирования не вставляются

Добавил проверку на то, есть ли между операциями копирования между оригинальными массивами и копиями операторы записи/чтения. На основе этого ненужные операции копирования не вставляются
xnpster added 1 commit 2024-11-06 19:19:34 +00:00
Author
Collaborator

Добавил вставку PROCESS_PRIVATE директив

Добавил вставку PROCESS_PRIVATE директив
Alexander_KS approved these changes 2024-11-07 14:30:54 +00:00
Alexander_KS left a comment
Owner

еще потестирую это на тестах.

еще потестирую это на тестах.
@@ -0,0 +18,4 @@
{
if (exp)
{
if (isSgArrayRefExp(exp))
Owner

какие массивы мы тут ищем? есть функция, которая проверяет на правильные массивы, а не на все подряд.

какие массивы мы тут ищем? есть функция, которая проверяет на правильные массивы, а не на все подряд.
Author
Collaborator

Что значит правильные? Возможно, фикс сообщения ниже фиксит и это

Что значит правильные? Возможно, фикс сообщения ниже фиксит и это
Owner

есть функция bool isArrayRef(SgExpression* ex); из SgUtils, которая проверяет нужные массивы, по всему проекту это уже распространилось.

есть функция bool isArrayRef(SgExpression* ex); из SgUtils, которая проверяет нужные массивы, по всему проекту это уже распространилось.
xnpster marked this conversation as resolved
@@ -0,0 +52,4 @@
if (!arg)
return;
if (arg->variant() != ARRAY_REF)
Owner

что если это будет массив строк? то есть не распределенный и вообще массив, который никогда не будет распределнным?

что если это будет массив строк? то есть не распределенный и вообще массив, который никогда не будет распределнным?
Author
Collaborator

Добавил проверку на распределённость в конце функции:

DIST::Array* array_p = getArrayFromDeclarated(declaratedInStmt(by_symb), array_name);
        if (array_p && array_p->GetDistributeFlagVal() == Distribution::distFlag::DISTR ...)
Добавил проверку на распределённость в конце функции: ``` DIST::Array* array_p = getArrayFromDeclarated(declaratedInStmt(by_symb), array_name); if (array_p && array_p->GetDistributeFlagVal() == Distribution::distFlag::DISTR ...) ```
@@ -0,0 +65,4 @@
if (!need_replace)
{
switch (var)
Owner

возможно тут можно использовать производные классы Sg для принтов и write/read

возможно тут можно использовать производные классы Sg для принтов и write/read
Author
Collaborator

Можно, но зачем делать if else, если switch подходит? Или каст к Sg классам чем-то принципиально лучше?

Можно, но зачем делать if else, если switch подходит? Или каст к Sg классам чем-то принципиально лучше?
Owner

имелось в виду в самом свиче, так как там явно не все случаи учтены, может быть стоит посмотреть разбор этих операторов в IR, так как там могут быть "циклы" в этих операторах вывода. А остальные операторы, которые ввод вывод формируют или участвую в нем, не нужно обрабатывать?

имелось в виду в самом свиче, так как там явно не все случаи учтены, может быть стоит посмотреть разбор этих операторов в IR, так как там могут быть "циклы" в этих операторах вывода. А остальные операторы, которые ввод вывод формируют или участвую в нем, не нужно обрабатывать?
Author
Collaborator

Я думаю стоит сначала слить, а потом обработать другие варианты
В целом здесь и не нужно парсить все случаи - достаточно распарсить тривиальный случай fmt = *, args = <один массив>, во всех остальных - консервативно помечать все массивы для подстановки

Я думаю стоит сначала слить, а потом обработать другие варианты В целом здесь и не нужно парсить все случаи - достаточно распарсить тривиальный случай fmt = *, args = <один массив>, во всех остальных - консервативно помечать все массивы для подстановки
@@ -0,0 +326,4 @@
}
void replaceDistributedArraysInIO(std::vector<ParallelRegion*>& regions,
const std::map<std::string, std::vector<FuncInfo*>>& allFuncInfo,
Owner

std:: можно стереть, ниже без std:: уже есть описания.

std:: можно стереть, ниже без std:: уже есть описания.
xnpster marked this conversation as resolved
xnpster added 1 commit 2024-11-07 19:14:01 +00:00
Author
Collaborator

@Alexander_KS мои ответы или коммит уведомления пришли? Или на это упоминание хотя бы?

@Alexander_KS мои ответы или коммит уведомления пришли? Или на это упоминание хотя бы?
Owner

Нужно сделать или rebase или merge, так как не самая актуальная версия

Нужно сделать или rebase или merge, так как не самая актуальная версия
xnpster added 2 commits 2024-11-12 19:59:23 +00:00
xnpster requested review from Alexander_KS 2024-11-12 22:20:27 +00:00
Alexander_KS force-pushed replace_dist_arrays_in_io from dc18a17e5a to 4a06430139 2024-11-14 06:16:52 +00:00 Compare
Alexander_KS changed title from [WIP] add pass REMOVE_DIST_ARRAYS_FROM_IO, make copyArray fuction from resolve_par_regions public to add pass REMOVE_DIST_ARRAYS_FROM_IO, make copyArray fuction from resolve_par_regions public 2024-11-14 06:19:14 +00:00
Alexander_KS merged commit b163958711 into master 2024-11-14 06:19:28 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Alexander_KS/SAPFOR#53