2014-01-05 4 views
0

это я снова. Итак, у меня проблема с параллелизмом в Ada. В основном часть моей программы выглядит так:Параллельность с петлями

for i in 1..it loop 

    for x in 1..A loop 
     for y in 1..B 
      --tab(x,y):=... 
     end loop; 
    end loop; 

    for x in 1..A loop 
     for y in 1..B 
      --tab(x,y):=... 
     end loop; 
    end loop; 

end loop; 

Внутри этих циклов есть некоторые расчеты. То, что я намереваюсь сделать, состоит в том, чтобы заставить эти две «внутренние» петли работать одновременно. Либо один элемент из цикла 1, то один элемент из цикла 2 или немного меньше «симметричный». Но обычно я хочу, чтобы это выглядело так: первая итерация, две «внутри» петли работают одновременно, все операции завершаются, завершается итерация. Вторая итерация такая же и т. Д. Мои вопросы: могу ли я сделать это с заявлениями «ВХОД» и «ПРИНИМАЕТ»? Или это потребует чего-то большего? Если бы вы могли просто указать мне правильное решение, потому что я видел много примеров, но никто не устраивал мою проблему.

+1

Прежде чем задавать больше вопросов, вы должны вернуться к предыдущим и ** принять ** полезные ответы. –

+0

Вы правы, просто исправили это. – user2443194

+1

Для разработки параллельной реализации нам может потребоваться дополнительная информация. Например, если 'tab (x, y)' является общим и обновляется обоими процессами, он, вероятно, лучше всего будет реализован как «защищенный объект», и вам не понадобятся инструкции ввода/принятия для синхронизации доступа к нему. Эти (aka Rendezvous), вероятно, лучше всего зарезервированы для сообщений, переданных от одной задачи к другой. Если ваши петли не взаимодействуют так, вы можете использовать более легкие задания веса без рандеву. –

ответ

0

Если две внутренние петли действительно не разделяют каких-либо данных, вы можете сделать это Лок это:

task First; 
task Second; 

task body First is 
    ... 
begin 
    for i in 1 .. it loop 
     for x in 1 .. A loop 
     for y in 1 .. B loop 
      ... 
     end loop; 
     end loop; 
    end loop; 
end First; 

task body Second is 
    ... 
begin 
    for i in 1 .. it loop 
     for x in 1 .. A loop 
     for y in 1 .. B loop 
      ... 
     end loop; 
     end loop; 
    end loop; 
end Second; 
+0

Прошу прощения, я ошибся. Они разделяют этот массив минимально, но они делают (половина + один столбец). Таким образом, «главная» итерация должна заканчиваться, когда заканчивается два процесса. – user2443194

+1

Один (ленивый) вариант, чтобы поставить там рандеву, чтобы синхронизировать. («Правильно» - скопировать общие данные в соответствующее время.) –

+0

Благодарим за помощь. – user2443194

0

Вы можете ограничить количество задач на сумму ядер, поддерживаемых системой. См. Этот пример при расчете pi: https://github.com/AdaDoom3/OldStuff/blob/master/time_pi.adb

+0

Возможно, хотя лучше всего моделировать проблему под рукой, используя столько задач, сколько естественно - это держит ваш код более высокоуровневым и более портативным. – Shark8

+0

Но в этом случае похоже, что естественная форма - это единственная задача. –

Смежные вопросы