Параллелизация GRASS "для бедных"

Решенные задачи, первая запись - описание решения.
Ответить
KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

Параллелизация GRASS "для бедных"

Сообщение KolesovDmitry » 24 дек 2011, 20:28

Многоядерной машиной в наше время никого не удивишь, однако большая часть программных модулей написана так, что выполняются они лишь на одном ядре. В результате становится обидно, когда на мощной многоядерной машине вычислительно-сложная команда "грузит" только одно ядро, и возникает понятное желание как-то распараллелить процесс.

Есть очень простая методика:
  • 1) Исходная область делится на подобласти, т.е. создается несколько наборов с разным географическим охватом (с частичным нахлестом).
    2) В каждом наборе запускается в фоновом режиме необходимый скрипт.
    3) Из частных результатов в исходной области собирается окончательный результат.
Первая и третья часть хорошо документированы, а вот со второй есть некоторые проблемы.

Здесь описывается процесс параллельного запуска скрипта в нескольких наборах. В качестве примера будем использовать область spearfish60, в котором уже есть два набора: PERMANENT и user1 (в действительности охваты этих наборов почти одинаковые, но в данном случае для наших целей это не важно).

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

Код: Выделить всё


#!/bin/bash

g.region res=1
r.resample in=elevation.10m out=tmp --o --q

g.region res=100
Пусть для определенности этот скрипт называется scr.sh.

По аналогии с этим примером создем скрипт - обертку. Будем передавать этому скрипту три параметра (пути к БД GRASS, Location и Mapset). Этот скрипт будет инициализировать соответствующие переменные окружения и запускать на выполнение скрипт scr.sh:
Спойлер

Код: Выделить всё


#!/bin/bash

# Скрипт-обертка над scr.sh
# Аргументы, передаваемые, скрипту:
# $1 -- Путь к БД
# $2 -- Название области
# $3 -- Название набора

if [ $# -ne 3 ]
then
echo 'Нужно передать три аргумента:
$1 -- Путь к БД
$2 -- Название области
$3 -- Название набора
'
exit 1
fi


THE_GISDBASE="$1"
THE_LOCATION="$2"
THE_MAPSET="$3"

# Настройка параметров перед запуском GRASS
GISBASE=/usr/lib/grass64
export GISBASE

PATH=$PATH:$GISBASE/bin:$GISBASE/scripts
export PATH

if [ -z "$LD_LIBRARY_PATH" ]
then
LD_LIBRARY_PATH=$GISBASE/lib
else
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$GISBASE/lib
fi
export LD_LIBRARY_PATH

GIS_LOCK=$$

THE_GRASSRC="/tmp/grassrc.$$"

echo "GISDBASE: $THE_GISDBASE
LOCATION_NAME: $THE_LOCATION
MAPSET: $THE_MAPSET
" > "$THE_GRASSRC"
export GISRC="$THE_GRASSRC"



# Вызываем скрипт GRASS
./scr.sh

# Удаляем файл с настройками, чтобы не мусорить в системе:
rm "$THE_GRASSRC"
Ну, и последнее, что осталось сделать -- запустить grass_external_script.sh в двух наборах одновременно, для этого создадим еще одну обертку, на этот раз над grass_external_script.sh:
Спойлер

Код: Выделить всё


#!/bin/bash

./grass_external_script.sh ~/laboro/GRASSDATA spearfish60 PERMANENT &
./grass_external_script.sh ~/laboro/GRASSDATA spearfish60 user1 &
Данный скрипт запускает в фоновом режиме скрипт grass_external_script.sh (передав ему необходимые параметры), в результате получаем, что скрипт grass_external_script.sh выполняется параллельно в двух наборах (что и подтвержается командной top)
Спойлер
Tasks: 213 total, 4 running, 207 sleeping, 1 stopped, 1 zombie
Cpu(s): 55.4%us, 5.6%sy, 0.0%ni, 39.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 3798960k total, 3617352k used, 181608k free, 316368k buffers
Swap: 4000116k total, 0k used, 4000116k free, 1002616k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
4849 dima 20 0 25256 2448 1220 R 100 0.1 0:10.95 r.resample
4848 dima 20 0 25252 2448 1220 R 100 0.1 0:10.96 r.resample
...

Аватара пользователя
rhot
Гуру
Сообщения: 1727
Зарегистрирован: 25 янв 2011, 17:50
Репутация: 194
Ваше звание: доктор
Откуда: Архангельск

Re: Параллелизация GRASS "для бедных"

Сообщение rhot » 02 фев 2012, 13:11

Хороший, полезный рецепт. Реально ли запустить этот скрипт для разных областей (с разными СК), а не наборов? Не верно ли, что во время одной GRASS сессии область (location) может быть использована только одна, а наборов (mapset) несколько?
___________(¯`·.¸(¯`·.¸ Scientia potentia est _/ {SILVA}:::{FOSS}:::{GIS} \_ Знание сила ¸.·´¯)¸.·´¯)___________

Александр Мурый
Гуру
Сообщения: 5173
Зарегистрирован: 26 сен 2009, 16:26
Репутация: 792
Ваше звание: званий не имею
Откуда: Москва

Re: Параллелизация GRASS "для бедных"

Сообщение Александр Мурый » 02 фев 2012, 14:06

rhot писал(а):Хороший, полезный рецепт. Реально ли запустить этот скрипт для разных областей (с разными СК), а не наборов? Не верно ли, что во время одной GRASS сессии область (location) может быть использована только одна, а наборов (mapset) несколько?
Верно. Но, наверное, можно написать скрипт для одновременного запуска нескольких сессий GRASS в нескольких областях с разными СК (или по скрипту для каждой области..?)

rhot, если интересно, создайте новую тему с подробностями и примерами --- будем экспериментировать :)
Редактор материалов, модератор форума

Ответить

Вернуться в «Рецепты»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей