2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Работа с огромными массивами в Fortran
Сообщение08.04.2011, 20:07 
Здравствуйте!

По работе появился алгоритм на Fortran, который нужно запускать, причем алгоритм нужно доработать таким образом, чтобы основная рабочая матрица (двумерный массив) был «гигантским», например:
Код:
REAL*8 U(32000,7000)

Текущий компилятор — Compaq Visual Fortran Version 6.6. Операционная система — Windows XP 32-bit.

Естественно, при попытке построить exe-файл появляется ошибка:
Debug/test.exe : warning LNK4084: total image size ... exceeds max (268435456); image may not run

Конечно, самое красивое решение — переписать алгоритм, чтобы он не запрашивал такого большого объема памяти. Но, к сожалению, иногда приходится выбирать другие решения.

Прошу подсказать:
1) Возможно ли увеличить до каких-то пределов ограничения на image size на Fortran для данного или другого компилятора (например, до 512 МБ, 1024 МБ, ...)?
2) Каким образом лучше работать с «очень гигантскими» массивами, например, 5-50 ГБ на Fortran? (Я понимаю, что уже на первых гигабайтах я наткнусь, во-первых, на ограничение на выделение памяти Windows XP 32-bit на одну программу, затем на возможности работы Windows XP 32-bit с памятью (3-4 ГБ), поэтому я имею в виду какие-нибудь механизмы, как БД, но для Fortran, которые там легко реализовать.)

Прошу прощения, если мои вопросы звучат глупо, так как я в Fortran даже не любитель... :)

Заранее спасибо!

 
 
 
 
Сообщение08.04.2011, 21:24 
Аватара пользователя

(Оффтоп)

Цитата:
32000 на 7000

Какие-то у Вас устаревшие понятия о "гиганском"

 
 
 
 Re: Работа с огромными массивами в Fortran
Сообщение09.04.2011, 19:09 
Утундрий в сообщении #432607 писал(а):
Цитата:
32000 на 7000

Какие-то у Вас устаревшие понятия о "гиганском"

Я понимаю, что исследователи на сегодня работают и с терабайтами информации :), но я просто говорил о «гигантском массиве» для Фортрана без применения специальных методов.

Самостоятельно по своим вопросам новичка мне удалось определить следующее:
1) Ошибка, которая возникала при компиляции, возникала именно из-за того, что память выделялась при запуске программы «статически». Если выделять ее же динамически, то программа начинает работать.
2) В Windows XP 32bit есть ограничения на выделение памяти для одной программы: 2 ГБ. Его можно обойти, если при компиляции использовать LARGEADDRESSAWARE (или после компиляции встроить этот параметр в EXE-файл). Также необходимо попросить Windows XP давать программам 3 ГБ путем добавления параметра /3GB в boot.ini.

Путем использования решений из пунктов 1 и 2 удалось запустить алгоритмы, которые требовалось.

3) В Windows XP 32bit и любой другой 32-битной ОС невозможно использовать более 4 ГБ памяти для одной программы. То есть получается, что если работать с памятью и пытаться выделять более 3 ГБ, то нужно переходить на 64bit-ные ОС и компиляторы.

В связи с этим прошу подсказать:
а) С помощью каких компиляторов можно скомпилировать приложения на Fortran, чтобы они использовали 64-битную адресацию памяти?
б) Какие еще варианты решения проблемы существуют в рамках ее решения на одном обычном компьютере? Получается, что если используется не память, то используется винчестер или флешки. Я пытался реализовать массивы на основе файлов, где каждый элемент массива — отдельный файл, но из этой затеи ничего не вышло (я просто создавал для каждого элемента свой файл и записал в файл значение элемента), как и можно было заранее предположить.

Заранее спасибо!

 
 
 
 Re: Работа с огромными массивами в Fortran
Сообщение09.04.2011, 19:46 
Alfucio в сообщении #432908 писал(а):
...
Я пытался реализовать массивы на основе файлов, где каждый элемент массива — отдельный файл, но из этой затеи ничего не вышло.
Конечно не по одному элементу в файл. Данные в файл-матрицу пишутся блоками. В зависимости от алгоритма блок - это несколько строк, несколько столбцов или подматрица общего вида. В прогамме реализуется кэширование данных. Например:
- динамически выделяется буфер под один или несколько блоков;
- для обрашения к элементам массива вместо U[i,j] реализуются функции GETELEM(U,i,j), SETELEM(U,i,j), которые выполняют пересчет адресов и, если нужно, свопинг данных.

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

 
 
 
 Re: Работа с огромными массивами в Fortran
Сообщение09.04.2011, 19:52 
Yuri Gendelman в сообщении #432928 писал(а):
... для обрашения к элементам массива вместо U[i,j] реализуются функции GETELEM(U,i,j), SETELEM(U,i,j), которые выполняют пересчет адресов и, если нужно, свопинг данных.

Данные функции я реализовывал, конечно, в своем сегодняшнем «монстроподобном» алгоритме выделения под каждый элемент одного файла :). Подскажите, пожалуйста, не встречались ли Вы с готовыми библиотеками, модулями или функциями, реализующими подобное на Fortran?

 
 
 
 Re: Работа с огромными массивами в Fortran
Сообщение10.04.2011, 16:59 
Alfucio в сообщении #432936 писал(а):
...не встречались ли Вы с готовыми библиотеками, модулями или функциями, реализующими подобное на Fortran?
Нет, не встречался. И не уверен, что такие универсальные библиотеки существуют. Обычно программы обработки матриц, не помещающихся в памяти, очень специфичны. Операции чтения из матрицы и записи в матрицу всегда оказываются "узким местом" и оптимизируются для конкретного применения.

 
 
 
 Re: Работа с огромными массивами в Fortran
Сообщение10.04.2011, 18:51 
Спасибо!

 
 
 
 Re: Работа с огромными массивами в Fortran
Сообщение10.04.2011, 20:05 
Alfucio в сообщении #432936 писал(а):
Подскажите, пожалуйста, не встречались ли Вы с готовыми библиотеками, модулями или функциями, реализующими подобное на Fortran?
Ну, есть такая библиотека HDF. Она в общем-то универсальная, написана для работы с файлами с большими массивами данных. В ней относительно несложно (хотя надо привыкнуть конечно) делаются всякие доступы по строкам, столбцам, блоками.

 
 
 
 Re: Работа с огромными массивами в Fortran
Сообщение11.04.2011, 10:10 
Спасибо за информацию о HDF!

Подскажите, пожалуйста, правильно ли я понимаю, что если запустить приложение, скомпилированное в Compaq Visual Fortran, в Windows XP 64bit, то оно запустится как 32-битное приложение? В Compaq Visual Fortran невозможно скомпилировать 64-битное приложение, насколько я понимаю?

Если так, подскажите, пожалуйста, каким компилятором это можно сделать?

 
 
 
 Re: Работа с огромными массивами в Fortran
Сообщение11.04.2011, 11:34 
Alfucio в сообщении #433537 писал(а):
Если так, подскажите, пожалуйста, каким компилятором это можно сделать?
Про Compaq ничего не знаю, подозреваю, что он 64 бита не поддерживает. Да, 64 бита должны поддердивать как система, так и компилятор.
Лучше всего -- Intel Fortran. Под виндой стоит денег. Если не пользоваться противозаконными методами.
Можно попробовать gcc (в котором есть gfortran) например отсюда. Оно 64 бита поддерживает.

 
 
 
 Re: Работа с огромными массивами в Fortran
Сообщение11.04.2011, 22:12 
Проверил на Windows XP 64bit, все получилось с gfortran: теперь можно до 8 ТБ памяти использовать :) (конечно, это больше похоже на шутку, так как на обычном PC эта память будет виртуальной, и вычисления будут идти очень долго, но в теории решение найдено, и частично его можно использовать на практике).

Спасибо!

 
 
 [ Сообщений: 11 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group