Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Fortran > [Pro] Распаралелить. Метод гиперплоскостей |
Автор: ctud 4.1.2009, 02:51 |
Кто в силах, помогите с прогой, очень прОшу (распаралелить) ;////////////////////////////////////////////////////// Исходный цикл имеет вид: DO 21 I=1,N DO 21 J=1,L B(J,I)=(A(I,J)-C(J,I)-D(I)) D(I)=B(I,I)/2 21 CONTINUE Метод гиперплоскостей |
Автор: marcusmae 9.1.2009, 13:45 |
ctud, Просто распараллелить Вам поможет автораспараллеливание (см. опции компилятора). А чтобы распараллелить так, чтобы от этого был толк, необходимо знать, как будут кешироваться значения массивов. В частности, они будут кешироваться по-разному в зависимости от того, мало ли N или L. А если оба не малы, то может поможет chop into chunks - разбивать цикл на кэшируемые по размеру данных подциклы и их уже параллелить. |
Автор: ctud 14.1.2009, 01:30 |
мне нужено было распаралелить "Методом гиперплоскостей", я вроде писал, жаль помощь вовремя не пришла |
Автор: marcusmae 14.1.2009, 03:00 | ||||
А, вот оно что. Жаль, что невовремя, надеюсь, всё в порядке. Но всё же... Это значит надо так разбить, чтобы не было зависимостей, да?
Кажется, тут для каждого i при 1 < j < i D(i) будет всё-время один, а при j > i - всё-время другой. Значит, можно
Примерно так. Зависимостей по данным ни для какого цикла, будь он параллльный, тут вроде нет, а эквивалентность результатов вроде должна быть (при доп. проработке особых случаев). Не проверял, может это и неправильно, но похоже. И ещё по-моему для такого рода задач есть какой-то строгий метод типа построения свёрток графов что ли. Интересно, каков ответ? И ещё больше интересно: скажите, пожалуйста, а где Вас этому учат, если не секрет? |