Unified Parallel C (UPC) — это расширение языка C, разработанное для высокопроизводительных вычислений на крупномасштабных параллельных машинах. Язык представляет единую программную модель для систем с общей и разделенной памятью. Количество параллелизма фиксируется на старте программы, обычно с одним потоком на ядро процессора.
» Официальный сайт UPC
» Официальный сайт Berkeley UPC
В своё время возникли определенные трудности с разворачиванием UPC и отсутствием каких-либо подсказок по первым шагам ни в русскоязычном, ни в англоязычном сегменте интернета, кроме официальной инструкции INSTALL.TXT, которую пришлось переваривать.
Чтобы сей опыт не пропал даром, я решил написать статью по установке UPC в различных средах.
В случае возникновения трудностей или вопросов можно обратиться к создателям за технической поддержкой. Отвечают довольно быстро (с учетом того, что находятся на другой стороне планеты). Большая благодарность Paul Hargrove и Dan Bonachea за то, что помогли во всём этом разобраться.
Установка Berkeley UPC в Windows
Подготовка среды
В основном UPC заточен под Linux, поэтому первое, что придется сделать, это установить линуксоподобную консоль и необходимые пакеты:
1. Установить Cygwin (лучше в папку с названием без пробелов, например, C:ProgramsCygwin64)
→ www.cygwin.com/setup-x86.exe
→ www.cygwin.com/setup-x86_64.exe
Помимо установки по умолчанию потребуется добавить пакеты gcc (gcc-core, gcc-g++). Проверить установку можно командой:
cygcheck -s
2. Установить Perl либо скачать его среди пакетов Cygwin
Установка Berkeley UPC
1. Скачать Berkeley UPC (C:Programsberkeley_upc-2.22.3)
2. Создать подкаталог build (C:Programsberkeley_upc-2.22.3build)
3. Запустить Cygwin
4. Запустить скрипт configure. Для указания каталога установки необходимо использовать опцию --prefix=dir
, для указания сети по умолчанию --with-default-network=smp
(Symmetric Multiprocessing, локальная многоядерная машина):
cd /cygdrive/c/Programs/berkeley_upc-2.22.3/berkeley_upc-2.22.3/build
../configure --prefix=/cygdrive/c/Programs/berkeley_upc-2.22.3 --with-default-network=smp
SUCCESS! The configure step is now complete. You should now proceed with:
gmake; gmake install
5. Скомпилировать UPC:
make
6. Установить UPC:
make install
Папки opt, dbg содержат различные построения runtime библиотек, используемых кодом UPC. Папка opt содержит оптимизации и используется по умолчанию. Папка dbg используется для отладки при использовании параметра –g в upcc. Не следует использовать напрямую содержимое этих папок. Необходимо пользоваться утилитами upcc и upcrun в папке build или подпапке bin в папке инсталляции.
Чтобы не указывать каждый раз путь до утилит, можно добавить путь bin в переменную среды PATH.
Тесты конфигурации UPC (по желанию)
0. Каждая подпапка build содержит конфигурационный файл upcc.conf. При необходимости проверить его и отредактировать.
1. Минимальный тест конфигурации (из папки build):
env UPCC_FLAGS= ./upcc --norc --version
This is upcc (the Berkeley Unified Parallel C compiler), v. 2.22.3
(getting remote translator settings...)
----------------------+---------------------------------------------------------
UPC Runtime | v. 2.22.3, built on Oct 26 2016 at 10:22:58
----------------------+---------------------------------------------------------
UPC-to-C translator | v. 2.22.2, built on May 12 2016 at 15:50:34
| host aphid linux-x86_64/64
| gcc v4.2.4 (Ubuntu 4.2.4-1ubuntu4)
----------------------+---------------------------------------------------------
Translator location | upc-translator.lbl.gov/upcc-2.22.2.cgi
----------------------+---------------------------------------------------------
networks supported | udp smp
----------------------+---------------------------------------------------------
default network | smp
----------------------+---------------------------------------------------------
pthreads support | available (if used, default is 2 pthreads per process)
----------------------+---------------------------------------------------------
2. Скомпилировать тесты:
make tests-hello
==== UPC «HELLO WORLD» TESTS SUCCESSFULLY COMPILED ====
Your UPC compilation setup appears to be working for all detected networks: udp smp
You should now test UPC runtime operation for each network of interest.
Start by testing the single-node smp/pthreaded network, with a command like:
./upcrun -n 2 libupcr-smp-par-test
3. Проверить результаты для каждого типа сети:
./upcrun -n 2 ./opt/libupcr-smp-par-test
UPCR: UPC threads 0..1 of 2 on SERAVKIN-PC (process 0 of 1, pid=17100)
Welcome to Berkeley UPC!!!
— Hello from thread 0
— Hello from thread 1
./upcrun -n 2 ./opt/libupcr-udp-par-test
upcrun: nodes not specified! See RUNNING UDP-BASED UPC JOBS in 'man upcrun'
Пример
cd /cygdrive/c/Programs/berkeley_upc-2.22.3/bin
./upcc /cygdrive/c/Programs/berkeley_upc-2.22.3/upc-examples/hello.upc -o hello -pthreads
./upcrun -n 4 hello
UPCR: UPC threads 0..3 of 4 on SERAVKIN-PC (process 0 of 1, pid=32016)
Welcome to Berkeley UPC!!!
— Hello from thread 2!!!
— Hello from thread 1!!!
— Hello from thread 3!!!
— Hello from thread 0!!!
Неприятные ограничения
В среде Windows возможно использование только онлайн транслятора UPC-to-C (используется по умолчанию). Следовательно, нужно быть онлайн, работает медленнее. Но самое напряжное, что потенциально у Беркли есть возможность перехватывать все программы. Если задачки учебные, то как бы ладно, а если что-то серьезное, то уже как-то неуютно. Плюс, есть опасения, что отладка работает только в Linux. Чтобы всё это дело завелось на Windows можно установить виртуальную машину
Виртуальная ROSA Fresh
1. Сначала нужно установить виртуальный менеджер, например, Oracle VM VirtualBox.
2. Скачать образ Linux. Выбор пал на ROSA Fresh KDE, т.к. это отечественная разработка.
3. Монтировать в виртуальный привод, например, DAEMON Tools Lite.
4. Добавить новую машину Other Linux, выделить оперативную память сколько не жалко.
5. Настроить:
Общие – Дополнительно: буфер и Dragn’n’Drop — двунаправленный
Система – Процессор: процессоры – все ядра, ограничение 90% (иначе основная система перестанет реагировать при интенсивной нагрузке).
Дисплей – Экран: видеопамять 96 Мб
Сеть – сетевой мост.
6. Запустить виртуальную машину. Выбрать пункт Install ROSA Desktop, следовать подсказкам системы. Первые впечатления положительные.
Установка в среде Linux
Подготовка среды
1. Установить g++, запустив в терминале команду:
urpmi gcc-c++
Установка Berkeley UPC-to-C translator
1. Cкачать Berkeley UPC-to-C translator и открыть терминал в папке (через контекстное меню).
2. Запустить команду make:
make
— *** Build complete! ***
You may now install the compiler with:
make install PREFIX=/prefix/to/use
3. Запусть install с повышенными привилегиями:
sudo make install
— *** Installation complete! ***
To use this translator LOCALLY, insert the following pathname:
/usr/local/bupc_translator/targ
in the 'translator' setting of upcc.conf or ~/.upccrc,
or pass it to upcc -translator=path
Сборка Berkeley UPC
1. Скачать Berkeley UPC
2. Создать подпапку build, открыть терминал в папке (через контекстное меню)
3. Запустить конфигурационный файл с указанием локального транслятора и сети по умолчанию smp (Symmetric Multiprocessing, локальная многоядерная машина):
../configure BUPC_TRANS=/usr/local/bupc_translator/targ --with-default-network=smp
SUCCESS! The configure step is now complete. You should now proceed with:
gmake; gmake install
4. Скомпилировать UPC:
make
Тесты конфигурации UPC (по желанию)
0. Каждая подпапка build содержит конфигурационный файл upcc.conf. При необходимости проверить его и отредактировать
1. Запустить тест конфигурации из папки build:
env UPCC_FLAGS= ./upcc --norc --version
This is upcc (the Berkeley Unified Parallel C compiler), v. 2.22.3
----------------------+---------------------------------------------------------
UPC Runtime | v. 2.22.3, built on Oct 26 2016 at 14:01:01
----------------------+---------------------------------------------------------
UPC-to-C translator | v. 2.22.2, built on Oct 25 2016 at 16:22:01
| host Rosa-VB linux-x86_64/64
| gcc v4.9.2 20140811 (ROSA)
----------------------+---------------------------------------------------------
Translator location | /usr/local/bupc_translator/targ
----------------------+---------------------------------------------------------
networks supported | udp smp
----------------------+---------------------------------------------------------
default network | smp
----------------------+---------------------------------------------------------
pthreads support | available (if used, default is 2 pthreads per process)
----------------------+---------------------------------------------------------
2. Запустить компиляцию теста:
make tests-hello
==== UPC «HELLO WORLD» TESTS SUCCESSFULLY COMPILED ====
Your UPC compilation setup appears to be working for all detected networks: udp smp
You should now test UPC runtime operation for each network of interest.
Start by testing the single-node smp/pthreaded network, with a command like:
./upcrun -n 2 libupcr-smp-par-test
3. Проверить результаты для каждого типа сети:
./upcrun -n 2 ./opt/libupcr-smp-par-test
UPCR: UPC threads 0..1 of 2 on Rosa-VB (pshm node 0 of 1, process 0 of 1, pid=12494)
Welcome to Berkeley UPC!!!
— Hello from thread 1
— Hello from thread 0
./upcrun -n 2 ./opt/libupcr-udp-par-test
upcrun: nodes not specified! See RUNNING UDP-BASED UPC JOBS in 'man upcrun'
Установка Berkeley UPC
1. Запустить команду make install из build с повышенными правами. По умолчанию установка производится в каталог /usr/local/berkeley_upc. Чтобы изменить каталог можно использовать опцию --prefix=dir
sudo make install
2. Добавить путь в переменную окружения. Для этого добавить строчку в файл /home/user/.bashcr (автоматический запуск при открытии терминала), либо применить для текущей сессии:
export PATH=$PATH:/usr/local/berkeley_upc/bin
3. Проверить запуск:
upcc --version
This is upcc (the Berkeley Unified Parallel C compiler), v. 2.22.3
Пример
1. Открыть терминал в папке upc-examples.
2. Выполнить команды:
upcc ./hello.upc -o hello -pthreads
upcrun -n 4 hello
UPCR: UPC threads 0..1 of 4 on Rosa-VB (pshm node 0 of 1, process 0 of 2, pid=13295)
UPCR: UPC threads 2..3 of 4 on Rosa-VB (pshm node 0 of 1, process 1 of 2, pid=13320)
Welcome to Berkeley UPC!!!
— Hello from thread 1
— Hello from thread 3
— Hello from thread 0
— Hello from thread 2
Среда разработки Eclipse
В среде разработке Eclipse имеется поддержка языка Berkeley UPC. Достаточно распаковать из архива Eclipse for Parallel Application Developers. Подробнее о проекте Eclipse Parallel Tools Platform (PTP) можно почитать тут.
После распаковки необходимо выполнить следующие настройки:
0. Установить Java Runtime Environment
1. Проверить обновления: Открыть меню Help → Check For Updates. Обновить C/C++ Berkeley UPC (Unified Parallel C) Toolchain Support
2. Создать новый проект «Hello World UPC Project», Toolchains: Linux Berkeley UPC (много полезных настроек по умолчанию)
3. Указать пути includes: открыть Properties проекта → C/C++ General → Path and Symbols. Для языка UPC добавить include пути:
Конфигурация Release:
/usr/local/berkeley_upc/opt/include/upcr_preinclude
/usr/include
Конфигурация Debug:
/usr/local/berkeley_upc/dbg/include/upcr_preinclude
/usr/include
4. Отключить проверку орфографии русских комментариев. Правой кнопкой мыши по комментарию, выбрать пункт Disable spell check.
Примечания
Использование
Много встроенного мануала:
man upcc
man upcrun
Отладка
Рекомендуется использовать отладку с помощью программы TotalView, но если её нет, то можно воспользоваться обычным отладчиком С, подробнее тут.
Благодарю за внимание!
Автор: VeleslavSeravkin