Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329

Открыть новую тему     Написать ответ в эту тему

akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на ФОРТРАН, как общего так и конкретного характера.
Постарайтесь дать как можно больше информации о возникшей проблеме -- это в конце концов в ваших же интересах чтобы вам помогли...

прежде чем просить помощи в задании
платное решение задач

ресурсы этого топика
ссылка на подборку ресурсов, собранных посетителями этого форума
 
то, чем мы решили поделиться
ссылка на страничку программ etc собственного изготовления, которыми любезно делятся наши форумчане


если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим
 
просьба к пишущим и отвечающим все большие листинги оформлять тегом more
и отключать графические смайлики при размещении фортран-кода

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 18:11 14-01-2007 | Исправлено: akaGM, 09:47 01-03-2020
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Есть здесь кто-то разбирающийся в OpenMP?
 
надо несколько циклов распараллелить, да вот что-то никак не разберусь, как действительно правильно это делать.  
 
Подробнее...

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 14:56 17-03-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r
насколько я всё это дело знаю, надо каждый цикл "обрамить" директивами

Код:
!$OMP PARALLEL DO
  do l=lmin,lmax
...
  end do
!$OMP END PARALLEL DO

и следить, чтобы счётчики в них были уникальными. т.е. l1, l2, l3  етц

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 15:58 17-03-2010
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
да, но в этих циклах используются фортрановские конструкции с массивами, поэтому надо кажется использовать еще и omp workshare, вот только комбинировать с omp parallel do  их нельзя. Затык короче по незнанию. Ладно, иду разгребать доки.

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 18:44 17-03-2010 | Исправлено: terminat0r, 18:45 17-03-2010
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r
Вообще workshare есть не во всех компиляторах, если я правильно помню то у интелов/PGI её нет (или по крайней мере не было года три назад когда я пытался это куда-то воткнуть).
Edit: вроде есть теперь
 
Каким компилятором пользуетесь если не секрет?
 
wf1, wf2, h0matrix массивы?
 
Вообще как-то так:
 

Код:
 
!$omp parallel shared(lmin, lmax, nr, nr2, wf1, wf2, h0matrix) &
!$omp &          private(l)                                                                                            
!$omp do schedule(dynamic)  
     do l=lmin,lmax
       wf2(1:nr,l)=h0matrix(1:nr,l)*wf1(1:nr,l)
       wf2(1:n2,l)=wf2(1:n2,l)+h0matrix2*wf1(3:nr,l)
       wf2(1:n1,l)=wf2(1:n1,l)+h0matrix1*wf1(2:nr,l)
       wf2(2:nr,l)=wf2(2:nr,l)+h0matrix1*wf1(1:n1,l)
       wf2(3:nr,l)=wf2(3:nr,l)+h0matrix2*wf1(1:n2,l)
     end do  
!$omp end do nowait                                                                                                  
!$omp end parallel
 


Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 18:53 17-03-2010 | Исправлено: FuzzyLogic, 18:58 17-03-2010
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
здравствуйте.
Кто-нибудь сталкивался с такой проблемой:
Все переменные вещественного типа определены как double precision. Есть также функции такого же типа CC и SS, принимающая аргументы типа тоже double precision. Компилятор ругается следующим образом:
Compiling Fortran...
C:\MSDEV\Projects\PAGANO\Text1.f90
C:\MSDEV\Projects\PAGANO\Text1.f90(104): warning FOR4639: inconsistent data type for argument 3 in call to SS
C:\MSDEV\Projects\PAGANO\Text1.f90(105): warning FOR4639: inconsistent data type for argument 3 in call to CC
C:\MSDEV\Projects\PAGANO\Text1.f90 : error FOR2205: wrong data type for reference to FUNCTION SS from procedure PAGANO
C:\MSDEV\Projects\PAGANO\Text1.f90 : warning FOR4227: argument Z (number 3) in reference to procedure SS from procedure PAGANO incorrect: has the wrong data type
C:\MSDEV\Projects\PAGANO\Text1.f90 : error FOR2205: wrong data type for reference to FUNCTION CC from procedure PAGANO
C:\MSDEV\Projects\PAGANO\Text1.f90 : warning FOR4227: argument X (number 3) in reference to procedure CC from procedure PAGANO incorrect: has the wrong data type
Error executing fl32.exe.
Text1.exe - 2 error(s), 10 warning(s)
 
То есть, по сути получается, что хоть все переменные и функции типа double precision, но не удается скомпилировать.
 
пример кода:
program PAGANO
integer nlayer,i,j,n,m,res
double precision a,b,p,q,sigma0
double precision pi,tmp
double precision, allocatable:: F(:,:),G(:,:),C(:,:,:), h(:), L(:,:), R(:,:)
double precision, allocatable:: alpha(:,:),mj(:,:),MM(:,:,:),x(:),SSS(:)
double precision, allocatable:: matrix(:,:), w(:),XX(:)
integer, allocatable:: typ(:),S(:,:),LLL(:)
open (2,file='data.dat')
read (2,*) nlayer
allocate (F(3,nlayer) , G(3,nlayer), C(6,6,nlayer), typ(nlayer),h(nlayer),matrix(nlayer*6,nlayer*6),w(nlayer*6),L(3,nlayer), R(3,nlayer),alpha(3,nlayer),mj(3,nlayer),MM(3,3,nlayer),x(nlayer),XX(6*nlayer),S(6*nlayer,2),LLL(6*nlayer),SSS(6*nlayer))
.........
matrix (6*nlayer-2,i)=MM(3,i,nlayer)*CC(alpha(i,nlayer),mj(i,nlayer),x(nlayer)) !-пример обращения к функции
............
end
 
function CC(alpha,m,x)
double precision alpha,m,x,t
double precision CC
t=m*x
print *,alpha,m,x
CC=0.0 !cosh(t)
!if (alpha>0) then
! CC=cosh(t)
!else if (alpha<0) then
! CC=cos(t)
!else
! print *,'Alpha is incorrect!'
!end if
end function CC
 
П.С. компилятор Fortran PowerStation 4.0 (Microsoft Developer Studio)

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 18:53 17-03-2010 | Исправлено: stepanoxus, 18:57 17-03-2010
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r
Кстати, если пользуетесь интелами, я бы попробовал просто приделать -parallel к параметрам компиляции и посмотреть что получится. Реально если wf1/wf2 итд не какие-то сложные конструкции то от OpenMP выигрыша особого вы не получите. Сложение/умножение в большинстве случаев параллелить нет никакого смысла.
Т.е.

Код:
 
do i=1,N
A(i) = B(i)+C(i+1,i)
end do
 

в распараллеленном виде работать быстрее не будет.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 19:05 17-03-2010 | Исправлено: FuzzyLogic, 19:05 17-03-2010
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stepanoxus
В program PAGANO:         double precision, allocatable:: ... x(
                                       matrix (...CC(a1,a2,a3=x())  
В function CC(alpha,m,x): double precision x

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 19:06 17-03-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
{offtop}
stepanoxus
а ты случайно не слоистую среду считаешь, матрица слоя, пропускание, френель, все дела?
{/offtop}

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 19:20 17-03-2010
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
Не понял, что Вы имели в виду.
akaGM
Да, это расчет поля перемещений в слоистой среде. Про пропускание и френель не знаю.
 

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 19:34 17-03-2010
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
возможно где-то есть вызов CC с массивом "x" (а не его элемента) в качестве 3-го аргумента.

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 19:43 17-03-2010 | Исправлено: Igorr, 19:50 17-03-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
{offtop}
stepanoxus
ага, ясно...
 
Igorr
красивый у тебя пост :) с разрешёнными смайликами...
{/offtop}

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 20:09 17-03-2010
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Igorr
Не знаю. В качестве аргумента всегда передается x(nlayer), где nlayer - типа integer.
Самое интересное, что если все double precision заменить на real, то все компилится и работает.

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 20:40 17-03-2010 | Исправлено: stepanoxus, 20:46 17-03-2010
Igorr

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stepanoxus
Если по известной теории синтаксиса все чисто, тогда надо смотреть на то, что "непривычно глазу" (т.е. выявлять недокументируемые свойства). Мне, напр. непривычно видеть описание типа функции вторым оператором описания типа, а не первым. А мне ближе запись
double precision function CC(alpha,m,x).
И еще, попробуйте везде использовать IMPLICIT NONE
 
akaGM
не специально

Всего записей: 2003 | Зарегистр. 01-05-2002 | Отправлено: 20:58 17-03-2010 | Исправлено: Igorr, 21:22 17-03-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stepanoxus
проблема может быть в том, что функции CC и SS не описаны перед первым колом
 
теория гласит, что делать надо так:

Код:
program PAGANO
implicit none
...
interface
   double precision function CC(alpha,m,x)
     double precision alpha,m,x
! или так
     double precision, intent(inout) :: alpha,m,x
   end function CC
end interface
 
...
 
matrix (6*nlayer-2,i)=MM(3,i,nlayer)*CC(alpha(i,nlayer),mj(i,nlayer),x(nlayer))
 
end
 
double precision function CC(alpha,m,x)
implicit none
double precision alpha,m,x  
...
end function

а уж implicit none вообще должно ставиться без разговоров
 
Igorr

Цитата:
не специально

да
нарочно...

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 21:20 17-03-2010 | Исправлено: akaGM, 21:23 17-03-2010
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Большое спасибо! Помогло!

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 21:49 17-03-2010
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
FuzzyLogic
Спасибо за ответ.  

Цитата:
Каким компилятором пользуетесь если не секрет?  

да все тем же
ifort, gfortran

Цитата:
Кстати, если пользуетесь интелами, я бы попробовал просто приделать -parallel к параметрам компиляции и

я это уже делал, даже вот так принудительно
-parallel -par-runtime-control -par-threshold0
 
распараллелено автоматически очень много, но это все не дает никакого прироста. В программе 65 процентов времени отбирают две функции Подробнее... а остальное -так семечки. Вот я и подумал, что если допилить их с опэнмп, то дело будет в шляпе.
 

Цитата:
Сложение/умножение в большинстве случаев параллелить нет никакого смысла.  

Можно поподробнее, почему? Ведь если каждый процесс обрабатывает свою часть массива, то произв. должна линейно расти?

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 12:27 18-03-2010
vaulin

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
да,plasmon

Цитата:
Да, со скобочками я лажанулся, должно быть x = 2*e1 + ((1+sqrt(2))/2)*e2
А в трехмерном пространстве вектор x получается легко -
x = 2*e1 + ((1+sqrt(2))/2)*e2 =  2*(1, 0, 0) + ((1+sqrt(2))/2)*(0,1,1)
 
Что бы легче было представлять, плоскость на которую проектируется вектор b перпендикулярна плоскости yOz и пересекает ее по биссектрисе угла yOz.

всё верно, получилось. Нарисовал не правильно . Спасибо.

Всего записей: 80 | Зарегистр. 16-10-2008 | Отправлено: 12:57 18-03-2010
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r
извини что влезаю...
глянул код и сразу наткнулся на

Цитата:
this subroutine calculates the multiplication of a matrix a by a vector x

в подробности фунциклирования не вникал, но вот вопрос:
 
а родную MATMUL() пробовал? твоя быстрее или там какой-то спец. функционал нужен?

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 13:19 18-03-2010
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
terminat0r

Цитата:
 Можно поподробнее, почему? Ведь если каждый процесс обрабатывает свою часть массива, то произв. должна линейно расти?  

Проблема в памяти, обычно всё что хотелось бы сразу в кэш не влезает, операции такие как сложение/умножение делаются очень быстро и на самом деле процессор успевает посчитать элемент быстрее нежели он может достать следующий из памяти предварительно положив туда предыдущий (понятно что из-за кэша мы таскаем не по одному, но смысл тот же).
Распараллелив сложение вы можете получить даже меньшую производительность, потому как кэш становится менее эффективным (сразу несколько процессов пытаются "потрогать" разные области памяти). Потому реально с около линейной эффективностью распараллеливаются случаи когда на каждый элемент уходит достаточно много тактов процессора и кол-во обращений памяти относительно проделываемой работы - невелико.
Та же ситуация скажем с MPI, но уже другого порядка - раскидать задачу на N компьютеров это конечно круто, но скажем сложение двух матриц порядка 1,000,000,000 - вы потратите 99% времени на таскание данных по сети, нежели на само сложение (утрированный вариант того что происходит с OpenMP).
 
С такими "простыми" случаями в некоторой степени помогает векторизация (у интелов есть).

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 13:30 18-03-2010 | Исправлено: FuzzyLogic, 13:36 18-03-2010
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM

Цитата:
извини что влезаю...

Да нет, я только буду рад
 

Цитата:
а родную MATMUL() пробовал? твоя быстрее или там какой-то спец. функционал нужен?

это sparse разреженная (или как их там по русски?) блок/диагональная симметрическая матрица.  
По диагоналям и некоторым субдиагоналям блоков ненулевые значения, а остальное все - нули.  
Возможно и стоит попробовать но с MKL ? Если там есть какойто детектор на разреженность,  то она бы могла подойти...
 
Добавлено:
FuzzyLogic

Цитата:
Распараллелив сложение вы можете получить даже меньшую производительность, потому как кэш становится менее эффективным

Да,  я уже вижу, проделав все ОМП операции над циклами получил почти нулевой прирост.  А если увеличивать число потоков (напр на четырех ядрах до 8), то произв уже и падает...  
 
Тоесть,  мне лучше браться за остальные 40 процентов программы?
 

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 15:14 18-03-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru