Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Pro] Распаралелить. Метод гиперплоскостей 
V
    Опции темы
ctud
Дата 4.1.2009, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



Кто в силах, помогите с прогой, очень прОшу 
(распаралелить)
;////////////////////////////////////////////////////// 
Исходный цикл имеет вид: 
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 
Метод гиперплоскостей
PM MAIL   Вверх
marcusmae
Дата 9.1.2009, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: нет
Всего: 39



ctud

Просто распараллелить Вам поможет автораспараллеливание (см. опции компилятора). А чтобы распараллелить так, чтобы от этого был толк, необходимо знать, как будут кешироваться значения массивов. В частности, они будут кешироваться по-разному в зависимости от того, мало ли N или L. А если оба не малы, то может поможет chop into chunks - разбивать цикл на кэшируемые по размеру данных подциклы и их уже параллелить.


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
ctud
Дата 14.1.2009, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 3.1.2009

Репутация: нет
Всего: нет



мне нужено было распаралелить "Методом гиперплоскостей", я вроде писал, жаль помощь вовремя не пришла
PM MAIL   Вверх
marcusmae
Дата 14.1.2009, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


Профиль
Группа: Участник
Сообщений: 874
Регистрация: 26.3.2006

Репутация: нет
Всего: 39



А, вот оно что. Жаль, что невовремя, надеюсь, всё в порядке. 

Но всё же... Это значит надо так разбить, чтобы не было зависимостей, да? 

Код

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


Кажется, тут для каждого i при 1 < j < i D(i) будет всё-время один, а при j > i - всё-время другой. Значит, можно

Код

DO I=1,N
  B(1,I)=(A(I,1)-C(1,I)-D(I))
  D(I)=B(I,I)/2
  DO J=2,I
    B(J,I)=(A(I,J)-C(J,I)-D(I))
  ENDDO
  D(I)=B(I,I)/2
  DO J=I+1,L
    B(J,I)=(A(I,J)-C(J,I)-D(I))
  ENDDO
ENDDO


Примерно так. Зависимостей по данным ни для какого цикла, будь он параллльный, тут вроде нет, а эквивалентность результатов вроде должна быть (при доп. проработке особых случаев). Не проверял, может это и неправильно, но похоже. И ещё по-моему для такого рода задач есть какой-то строгий метод типа построения свёрток графов что ли. Интересно, каков ответ? И ещё больше интересно: скажите, пожалуйста, а где Вас этому учат, если не секрет?


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Fortran | Следующая тема »


 




[ Время генерации скрипта: 0.1580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.