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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 330

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

akaGM

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

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

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


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

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

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

Цитата:
не работает(
Что не так?
 

Видимо, где-то ошибка  
На подобным образом заданный вопрос невозможно дать никакого другого ответа.

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 15:25 05-11-2009
Ryzhval

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Мне нужно создать программу на Fortran-е под mpi(у меня стоит HPC Pack 2008 SDK). Я установил Visual Studio 2005 и к нему компилятор PGI fortran. Простые программы запускаются, а вот под mpi - нет. Уже долго ищу в инете, как нужно правильно настроить студию, но все время не получается...  
Вот, что я сделал :

Цитата:
 
Project->Properties->Fortran->Preprocessor->Additional Include Directories поставил директорию к Include к HPC Pack 2008 SDK
Project->Properties->Fortran->External Procedures->Calling Convention поставил C by Reference
Project->Properties->Linker->General->Additional Library Directories ....поставил директорию к Lib к HPC Pack 2008 SDK
Project->Properties->Linker->Input->Additional Dependencies ... добавил msmpi.lib
 

 
Выдает ошибку :  
 

Цитата:
 
Linking...
example.obj : error LNK2019: unresolved external symbol _MPI_INIT referenced in function _MAIN_
example.obj : error LNK2019: unresolved external symbol _MPI_COMM_SIZE referenced in function _MAIN_
example.obj : error LNK2019: unresolved external symbol _MPI_COMM_RANK referenced in function _MAIN_
example.obj : error LNK2019: unresolved external symbol _MPI_FINALIZE referenced in function _MAIN_
 

 
Вот программа :  

Цитата:
 
    program example_mpi
    
    include 'mpif.h'        
 
    
    integer :: mpierror, mpisize, mpirank
 
    call MPI_Init(mpierror)
    call MPI_Comm_size(MPI_COMM_WORLD, mpisize, mpierror)
    call MPI_Comm_rank(MPI_COMM_WORLD, mpirank, mpierror)
 
    write(*,*) "Hi",mpisize,mpirank
 
    call MPI_Finalize(mpierror)
 
    end program example_mpi
 

 
Помогите плз... ОЧЕНЬ НУЖНО!

Всего записей: 3 | Зарегистр. 19-05-2009 | Отправлено: 16:15 05-11-2009 | Исправлено: Ryzhval, 16:19 05-11-2009
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ryzhval
У Вас линкер не видит соответствующие модули.  
Посмотрите здесь, как настраивается VS для параллельного программирования и дебагирования.  
_http://go.microsoft.com/fwlink/?LinkId=55932
Возможнео, Вам лучше установить
Microsoft Compute Cluster Pack SDK

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 16:38 05-11-2009
Ryzhval

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Еще сложность заключается в том, что я пишу код у себя дома (без кластеров). А запускать буду уже на другом компьютере-сервере удаленно. Поэтому я на свой комп поставил только все необходимое, но запустить вряд-ли смогу(мне главное екзешник сделать). У меня XP стоит.  
 
_http://go.microsoft.com/fwlink/?LinkId=55932  
тут рассказывается как настроить для C++. Для С++ у меня получилось все настроить, а вот под Фортран - нет.  
 
Под Фортран не хватает некоторых настроек таких как :
Debugging-> поставить Debugger to lounch (MPI Cluster Debugger) и настроить его
C++->Code Generation->Runtime Library поставить на MTd

Всего записей: 3 | Зарегистр. 19-05-2009 | Отправлено: 17:01 05-11-2009 | Исправлено: Ryzhval, 17:02 05-11-2009
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ryzhval
Я тоже все это проделывал дома. И на XP. Разницы в настройках для фортрана и C++ по сути нет. Более того, эта система позволяет эмулировать любое число процессоров. Поэтому отладить программы удается дома (на персоналке) ну а считать уже на реальном суперкомпьютере (ежели удастся захватить много процессоров). Опять же, возможно Вам надо установить, более родной для VS  
Microsoft Compute Cluster Pack SDK  
_http://www.microsoft.com/downloads/details.aspx?familyid=D8462378-2F68-409D-9CB3-02312BC23BFD&displaylang=en
Да и вот еще что,
Цитата:
Project->Properties->Fortran->External Procedures->Calling Convention поставил C by Reference  

Я точно не делал, собственно никогда не использовал два языка в одной программе.  Мб в этом все дело. Уберите, если вызов этих подпрограмм подчиняется фортрановским соглашениям, то у Вас мб и все плохо будет.
А в остальном, это достаточно рабочая среда, хотя собственно дебагированием я не занимался. Некогда было разбираться. И ошибки отлавливал по старинке - выдачами. При наличии уже олаженной программы, ловить ошибки распараллеливания выдачами - не сложно

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 17:27 05-11-2009 | Исправлено: Vskazka, 17:31 05-11-2009
Ryzhval

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо огромное за помощь....  
Убрал Calling Convention поставил C by Reference. и добавил библиотеку еще одну
 

Цитата:
 
1. set "C:\Program Files\Microsoft HPC Pack 2008 SDK\Include" as additional include directories in Fortran tab.
2. set "C:\Program Files\Microsoft HPC Pack 2008 SDK\Lib\amd64" as additional library directories in Link tab.
3. set "msmpi.lib msmpifmc.lib" as additional dependencies in link tab.
 

Всего записей: 3 | Зарегистр. 19-05-2009 | Отправлено: 17:38 05-11-2009
ZykovAlex

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrew10
 
Вы не могли бы скомпилить код который я выложил, и написать свои коментарии.
Заранее благодарин.

Всего записей: 7 | Зарегистр. 23-10-2009 | Отправлено: 09:12 06-11-2009
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ZykovAlex
Напишите, как именно и на каком этапе проявляется ошибка:
1. На этапе компиляции исходных файлов
2. На этапе сборки исполняемого файла
3. При выполнении.
 
Какая диагностика при этом выводится?
 
Кроме того, в  Вашей программе данные считываются из файла stbsvx.d. Чтобы посмотреть как тест работает, нужен еще этот файл.

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 13:33 06-11-2009
ZykovAlex

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ошибка появляется на этапе компиляции исходных файлов.
 
выводится: forrtl: severe (157): Program Exception - access violation
 
файл  stbsvx.d:
 
S T B S V  EXAMPLE PROGRAM DATA
5 3                     :Values of N, K
1                       :Values of INCX
U N N                   :Values of UPLO, TRANS, DIAG
25.0  27.0  21.0  10.0  3.0 :Values of vector X
                  7.0  11.0
            4.0   8.0  12.0
      2.0   5.0   9.0  13.0
1.0   3.0   6.0  10.0  14.0   :Values of array A                    

Всего записей: 7 | Зарегистр. 23-10-2009 | Отправлено: 08:56 09-11-2009
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ZykovAlex
 
Насколько я понимаю, это тестовая программа для функции STBSV из пакета BLAS. Эта функция работает с данными (матрица A и вектор X) с простой точностью, а у Вас они в главной программе описаны с двойной точностью (real(8)). Исправьте на real(4) и должно все сработать. У меня сработало.

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 15:44 10-11-2009
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
AZA_N
ты знаешь как, например, "удержать" точность в промежуточных вычислениях типа
 
f(i) = x(i)**2 * sin(10-x) + 100/cos(PI/2) - (i-1) * N**M / exp(x) ну и тд
так что повышение точности никогда не помешает

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 15:58 10-11-2009
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Вопрос, конечно, не ко мне - но не удержался.
В приведенном примере "потеря точности" сама по себе, без дополнительных каких-то  предположений не происходит.  (есть правда деление на ноль, если PI - это обычно понимаемое число).  
Потеря точности, например будет при 100000.02 +0.333- 100000.00 (при вычислении с ординарной точностью). И чтобы она на произошла, надо просто анализировать порядки чисел.  И в данном случае сначала вычесть из первого третье число и потом прибавить второе. Разбив действия на два. В общем же сия процедура (убирание  "потери точности") не алгоритмизируется на все случаи жизни. Каждый раз надо смотреть по своему.

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 17:07 10-11-2009
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Vskazka
во и я про то же...
нужны дополнительные телодвижения
 
tmp = x(i)**2
tmp = 2*tmp * sin()
...
например

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 18:37 10-11-2009
AZA_N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM, это Вы к чему? Если к моему предыдущему глупому вопросу, то "раненного кота" уже давно спасли здоровый сон и сплайны.  
 
А если вообще про борьбу за точность, то это и впрямь для каждой задачи своя борьба. Я не математик и не программист, а расчетчик. Мне проще придумать несколько тестовых задачек с заранее известным решением, и выяснить, а нужна ли мне бОльшая точность, или нет. А может и бороться не надо, станок то все равно точнее не изготовит. Т.е. главное, imho, эту точность правильно оценить для конкретной задачи.  
 
Если про "f(i) = x(i)**2 ... " То для начала не плохо было бы проверять, на что делить.  И цифры убрать - все в общем виде, параметры вверх; (i-1) в степени - за борт; **->*; real с integer не смешивать; все double, в т.ч. и функции, а не только аргументы,  "ну и тд".

Всего записей: 853 | Зарегистр. 10-11-2007 | Отправлено: 18:39 10-11-2009
Vskazka

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
В этом месте (которое Вы привели) Вы не добьетесь ничего для сохранения точности. Чтобы Вы не делали, либо одновременно, либо все вместе запишите - результат будет один и тот же. За одним , мб исключением. Не помню, где в Интеле, и есть ли там эта опция, но в лахее когда-то было - брать все из памяти. Т.е. не из стека сопроцессора. Дело в том, что сопроцессор молотит с 10 байтами, ну и если брать результаты  промежуточных вычислений там, а не из памяти - то получается разный результат.
AZA_N

Цитата:
(i-1) в степени - за борт;

Это еще с какой стати. Нет тут потери точности, сгенерите асемблернй код для разных эпостасей этого действия.
 
Цитата:
real с integer не смешивать;

Тоже ничего нет противного природе  - происходит автоматическая конвертация, причем точная. Если Вы будете писать в программе 1d2*2 и 1d2*2d0, то результат будит один и тот же.

Цитата:
все double,

И это правильно, хотя использовать этот совет там, где только две значимых цифры в мантиссе (ну типа в сейсмологии) и при этом обрабатывать молотя по 16, зачастую бывает накладно. И в зависимости от алгоритма, тогда так не делают.
Хотя я знаю ситуации (не слишком распространенные), когда приходится обрабатывать такие данные, с 300 знаками в мантиссе, иначе алгоритм не сработает  
 
 
 
 
 

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 19:00 10-11-2009
akaGM

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

Цитата:
Не помню, где... - брать все из памяти.
Дело в том, что сопроцессор молотит с 10 байтами, ну и если брать результаты  промежуточных вычислений там, а не из памяти - то получается разный результат

 
ну так мой пример именно из этой оперы
а поводу 80-битной арифметики -- сб уже давно есть более разрядная и на тех же писюках
 
AZA_N
кот -- "отец русской демократии"
рад за кота...

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 19:31 10-11-2009 | Исправлено: akaGM, 19:33 10-11-2009
Vskazka

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

Цитата:
ну так мой пример именно из этой оперы  

Это не потеря точности (во всяком случае не
 классически понимаемая проблема). Запретите брать из сопроцессора результаты промежуточных вычислений и будет все однотипно.

Цитата:
а поводу 80-битной арифметики -- сб уже давно есть более разрядная и на тех же писюках

Конечно существует, ( с любой разрядностью), а на некоторых коммерческих юниксах, вообще, в стандартную комплектацию входит... Но, накладных расходов там шибко много, и если есть возможность, то лучше без них. Если хотите, сравните более оптимизированные вычисления.  PC - сопроцессор 10 байтов, но интеловский фортран библиотечно (а не аппаратно) понимает quadro числа и можно проводить вычисления с 32 числами в мантиссе. Оцените время....

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 19:46 10-11-2009
akaGM

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

Цитата:
Запретите брать из сопроцессора результаты промежуточных вычислений и будет все однотипно.  

блин
или я что-то не понимаю или одно из двух
 
tmp = x(i)**2
tmp = 2*tmp * sin()
tmp = N*M  + tmp
откуда здесь берутся промежуточные результаты, не учитывая "правостороннеравенственные"?
 

Цитата:
PC - сопроцессор 10 байтов

если не считать SSE

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 19:54 10-11-2009 | Исправлено: akaGM, 19:56 10-11-2009
Vskazka

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

Цитата:
если не считать SSE

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

Цитата:
откуда здесь берутся промежуточные результаты, не учитывая "правостороннеравенственные"?  

Грубо говоря A*B*C +D - действие машины может идти по следующим сценариям
 
A,B - Загоняются в сопроцессор и перемножаются. Результат остается в стеке сопроцессора. Потом в сопроцессор загоняется число C и перемножается с тем результатом. и этот результат сохраняется в стеке сопроцессора, потом в сопроцессор загоняется число D, складывается  с тем числом, которое сохранилось в сопроцессоре и результат уж выводится в память.  
 
A,B - Загоняются в сопроцессор и перемножаются. Результат сохраняется в памяти (8 байт) . Потом в сопроцессор загоняется число C  и и получившийся временный результат умножения A*B. Перемножается и этот результат сохраняется в памяти. Потом в сопроцессор загоняется число D и это сохраненное в памяти тройное произведение, складываются   и результат опять  выводится в память.  
Так как формат чисел в памяти (double) -8 байт, а в сопроцессоре 10 байт, ясно, что может быть разница в последнем знаке. Или даже, при неудаче двух.
 
Если вычисления пойдут по второму сценарию результат будет тот же, что и
t=a*b
t=t*c
t=t+d
при этом, если мне не изменяет память, тот же лахей, и последний насильно разбитый сценарий мог провести по первому, черпая T все время из сопроцессора, а не выгружая - загружая его бесперечь из памяти  

Всего записей: 382 | Зарегистр. 24-11-2003 | Отправлено: 20:13 10-11-2009 | Исправлено: Vskazka, 20:19 10-11-2009
akaGM

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

Цитата:
Не очень понимаю, к чему это, мб отстал от жизни, но полагал, что при умножении двух двух флоатов, сопроцессор переводит их в десятибайтные, перемножает, а уж потм возвращает то количество байтов, которое было вначале

э-э-э
скорее это я уже отстал от жизни и думал, что при помощи SSE (при том же умножении mulps) конвертация идёт в рамках 128-бит
и эти 128-битные регистры -- аппаратные...

Всего записей: 24107 | Зарегистр. 06-12-2002 | Отправлено: 20:35 10-11-2009
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 330

Компьютерный форум 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