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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
и отключать графические смайлики при размещении фортран-кода

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

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stepanoxus
я не вижу для тебя другого выхода (точнее двух), кроме как:
 
1. написать самому процедуры перераспределения памяти
2. использовать ММ-функции Win API
это также ответит на твой вопрос:
Цитата:
Можно как-то узнать длину наибольшего непрерывного свободного блока памяти в таком случае? То есть нужно узнать такое наибольшее N, чтобы...

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

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 16:54 20-11-2011 | Исправлено: akaGM, 17:13 20-11-2011
terminat0r



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

Цитата:
теперь так можно, типа sizeof стал оператором что ли?  

тоже не знал пока не прочитал
 
FuzzyLogic

Цитата:
Нехороший пример, в стиле "индийского кода".  

Я и не писал, вернее просто подправил немного. Этот код с тест-кейса в багзилле gfortrana Спорили там долго
Решил и нас потроллить взбодрить немного
 

Цитата:
А realloc быстрее move_alloc именно в этом примере, в реальных приложениях это обычно не так.

Ну, я почему-то  могу себе представить случаи достаточно мелких масивов которые надо увеличивать и простые случаи типа  a = [a,x] должны быть более оптимизированы.  
 
Конечно все зависит есть ли подходящий кусок памяти за этим масивом, размер страницы и ответ на вопрос что хуже в данной ситуации- фрагментация памяти (realloc в glibc использует mremap, работает очень быстро) или потери на копирование данных (аналогично create + copy + move_alloc)

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 17:36 20-11-2011 | Исправлено: terminat0r, 17:44 20-11-2011
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А вообще можно освободить память, уничтожив ненужную мне часть массива? Т.е. например я создал массив real*8, allocatable:: mas1(100000), реально мне понадобятся лишь первые 30000 значений, и я хочу освободить память за счет не нужных мне 70000 значений, то есть я хочу из массива mas1(100000)  сделать массив mas2(30000), который расположен в памяти на том же месте, что и mas1 и занимает его первые 30000 элементов. Остальные 70000 пусть освобождаются. В си realloc (при уменьшении размера массива) вроде бы сделает именно это. Так можно сделать в фортране?

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 17:46 20-11-2011
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stepanoxus
увы мой друг, увы.  Это все вариации на тему и ув. akaGM уже описал все варианты. Похоже без оберток на C  и iso_c_binding вам не обойтись, если хотите сделать это эффективно.  
 
Пока стратегия в фортране следующая:  выделять память только когда знаешь размер, выделять нечасто  и большими кусками
 
 

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 18:27 20-11-2011 | Исправлено: terminat0r, 18:36 20-11-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stepanoxus
а вот скажи, ты с Си сюда (в смысле "на фортран") пришёл?
и если да, то как ты решал там такую проблему? та же самая реаллок на самом деле не гарантирует сохранность/непрерывность/того, что не будет использовано длительное  копирование блока
да и проблема ли это вообще?
 
70 000 даблов занимают всего 560 000 байт, т.е. чуть больше полуметра
у тебя что, в распоряжении 2-ой пень с 256 Мегами на борту?

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 18:41 20-11-2011
FuzzyLogic



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stepanoxus
А циферки (те которые nonZero) сильно сложно определяются? Просто я как-то решал нечто похожее, так там наличие двух дополнительных массивов размера N с "флагами" позволяло легко посчитать кол-во ненулевых элементов. И процедура такого подсчёта занимала всего ничего (по сравнению со временем нужным для решения самой системы уравнений)
 
Добавлено:
terminat0r

Цитата:
Я и не писал, вернее просто подправил немного.  

Я так и подумал что это откуда-то взято если честно, и "индийский код" это не в ваш огород лично, а в сторону конкретного примера который написан с одной целью - максимизировать разницу между C/F в плане выделения памяти.
 

Цитата:
Ну, я почему-то  могу себе представить случаи достаточно мелких масивов которые надо увеличивать и простые случаи типа  a = [a,x] должны быть более оптимизированы.

Вопрос имхо немного в другом. Парадигма Фортрана всегда была - за максимальную оптимизацию. А фрагментация памяти очень мешает таким приятным вещам как например использование кэша. А так, если подумать, массивы это тоже не панацея, есть списки и другие подобные конструкции, которые позволяют легко и непринуждённо манипулировать размерами и элементами.

Всего записей: 1920 | Зарегистр. 27-07-2002 | Отправлено: 19:10 20-11-2011 | Исправлено: FuzzyLogic, 19:17 20-11-2011
KChernov



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

Цитата:
Для количества ненулевых элементов есть оценка сверху, но она неэффективна (примерно в 3 раза завышает фактическое значение).

Так а эта оценка/3 чем не устраивает?
 

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

А зачем нужен именно непрерывный?
Для изменения размера это актуально, ибо влияет на необходимость копирования.
 

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

А зачем уменьшать?
Запустили задачу с максимальным использованием памяти, и пусть считает.
Посчитать объём можно по занимаемому размеру в памяти на переменную.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 20:40 20-11-2011
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я, наверное, так и сделаю. Одно холостое заполнение матрицы (без выделение под неё памяти), определение nNonZeros, выделение памяти нужного размера и финальное заполнение матрицы. Всем большое спасибо за помощь.
100000 даблов - это для примера было. На самом деле я решаю задачу размера порядка 3х300х300 неизвестных, на правую часть слау примерно столько же, еще сколько-то нужно на матрицу. Всего оперативы 6 Гб, возможно, используется файл подкачки.
На си я с работой на пределе памяти не сталкивался, но реаллоком пользовался. Наверное, у меня там возникли бы те же самые проблемы.

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 20:57 20-11-2011
akaGM

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

Цитата:
я решаю задачу размера порядка 3х300х300 неизвестных, на правую часть слау примерно столько же, еще сколько-то нужно на матрицу

3 x (3х300х300) = 81e4 => 81e4 * sizeof(real*8) =~ 6.5 MB
да это тьфу! одним статическим массивом можно обойтись...

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 21:24 20-11-2011
KChernov



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

Цитата:
Одно холостое заполнение матрицы (без выделение под неё памяти)

Это как это?
 

Цитата:
На самом деле я решаю задачу размера порядка 3х300х300 неизвестных, на правую часть слау примерно столько же, еще сколько-то нужно на матрицу

То есть это примерно 3х3х300х300 - около миллиона  даблов.
Даже если это риал16 (16 байт на число) - это всего лишь порядка 16Мб памяти - о чём вообще речь?
Вот у нас задачи с 10млн уравнений (правда в риал8) к 2Гб приделу на х32 подходили (но там ещё можно было уменьшить число массивов).
А 6Гб - это вообще 400млн риал16 (то есть ваша задача для 100млн уравнения должна влезать).
 
Добавлено:
akaGM
апиридил

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 21:25 20-11-2011
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
вы забываете, что для хранения матрицы нужна тоже память, намного большая памяти для хранения решения или правой части. В худшем случае (заполненная матрица) ее размер - n(размер задачи) в квадрате. Еще память нужна решателю, сколько - я не знаю, поскольку он сторонний
холостой проход - это имитация заполнения матрицы, если заполняемое число отлично от нуля, то счетчик числа ненулевых элемемтов увеличивается на 1. Поскольку я матрицу заполняю сам (своим кодом), то такой холостой проход я смогу организовать, подправив код.

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 21:59 20-11-2011 | Исправлено: stepanoxus, 22:04 20-11-2011
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stepanoxus
Вообще в такой ситуации может быть гораздо проще найти библиотеку с решателем, которые сами по себе поддерживают разреженные матрицы.
Поскольку тут нужны списки, скорее всего это будет либа не на Ф.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 22:06 20-11-2011
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
в принципе, вы мне уже довольно сильно помогли.  На самом деле, оказывается, проблема в решателе- почему-то он жрет много памяти. Использую intel mkl, он как раз заточен под разреженные матрицы. Буду ботать его маны. Моя матрица именно разреженная (nNonZeros<75n), и все вместе занимает менее 1 Гб. Пусть еще 2 Гб жрет система, почему-то задачу размера 3x350x350 решатель решать отказывается (говорит, не хватает памяти), хотя 3x300x300 еще решает. Получается, ему 3 Гб не хватает.

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 22:35 20-11-2011
vengr



Рафинированный Теоретик
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
stepanoxus

Цитата:
Всего оперативы 6 Гб

А ос у Вас какая, она эти 6га видит?

Всего записей: 3579 | Зарегистр. 21-08-2001 | Отправлено: 02:38 21-11-2011
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
win7 x64, видит.

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 08:59 21-11-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
stepanoxus
если всё-таки окажется позарез нужны _шустрые_ п/п типа move_allocate(), то советую написать их на АСМе без привязки к каким-либо библиотекам...
 
помощь обещаю...
 
а у тебя, случаем, не Сонька VAIO F?

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 11:59 21-11-2011
stepanoxus



Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
У меня asus n53sv.
Действительно, пока обхожусь без динамического выделения памяти - подобрал коэффициент, на который нужно умножать оценку для nNonZeros. Проблема с памятью в решателе, направлю силы щас в ту сторону. Большое всем спасибо!

Всего записей: 30 | Зарегистр. 27-09-2009 | Отправлено: 21:18 21-11-2011
OlGu

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

Цитата:
character*2 CRLF  
parameter (CRLF=char(13)//char(10))  
write(101,fmt="(f16.8,3X, f16.8, a2)", rec=3) x1, u1, CRLF

 
Так работает, спасибо!
 

Цитата:
Цитата:
open(0)
ну ты даешь...  
советую хотя бы так open(101, )

 
ну.. пока не мешало, но советом воспользуюсь!

Всего записей: 6 | Зарегистр. 17-11-2011 | Отправлено: 23:46 21-11-2011 | Исправлено: OlGu, 23:48 21-11-2011
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
OlGu
да ваще можно ещё проще:
Код:
 
  write(0,fmt="(a16, /)", rec=1) 'variables = x, u'
  write(0,"(a9,i6, /)", rec=2) 'zone i = ', 2
  write(0,fmt="(f16.8,3X, f16.8, /)", rec=3) x1, u1
  write(0,fmt="(f16.8,3X, f16.8, /)", rec=4) x2, u2

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 00:14 22-11-2011 | Исправлено: akaGM, 15:05 22-11-2011
Lapochka ili Chai



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Устанавливаю компилятор w_cprof p 11.1.054 novsshell
 
1. Надо ли давать ему доступ в сеть? (Не хотелось бы без нужды давать разрешения кому попало.)
2. Почему-то не хотят устанавливаться такие компоненты:
   -- Integration(s) in Microsoft Visual Studio
   -- Intel(R) Parallel Debugger Extension
   -- Integrated Documentation
Это можно вылечить?
 
 
3. Microsoft Development Product, как я понимаю, это SDK (это правильное предположение?), его лучше чтобы в процессе устанновки установила программа-установщик? Или лучше самому поискать его в интернете?
Ой, пардон, а вроде получается, что его вообще надо было заранее ставить?
 
Вообще-то там пишут так:
The Intel professional edition compiler requires that a     Microsoft* development product be installed. Refer to the Release Notes for a list of the required Microsoft* development tools.
 
А в дистрибутиве почему-то нет ни Microsoft* development tools, ни Release Notes ...

Всего записей: 847 | Зарегистр. 27-11-2003 | Отправлено: 11:32 24-11-2011 | Исправлено: Lapochka ili Chai, 12:06 24-11-2011
Открыть новую тему     Написать ответ в эту тему

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