Настройка «настроить» для openMP в R - PullRequest
6 голосов
/ 15 февраля 2011

У меня есть пакет R, который легко ускоряется с помощью OpenMP. Если ваш компилятор поддерживает его, вы получаете выигрыш, а если нет, то прагмы игнорируются, и вы получаете одно ядро.

Моя проблема в том, как заставить систему сборки пакетов использовать правильные параметры компилятора и библиотеки. В настоящее время у меня есть:

PKG_CPPFLAGS=-fopenmp
PKG_LIBS=-fopenmp

жестко запрограммирован в src / Makevars на моей машине, и это создается с поддержкой OpenMP. Но он выдает предупреждение о нестандартных флагах компилятора при проверке и, вероятно, сильно провалится на машине без возможностей openMP.

Решение, похоже, заключается в использовании configure и autoconf. Здесь есть некоторая информация:

http://cran.r -project.org / DOC / Инструкции / R-exts.html # Использование-Makevars

включая сложный пример компиляции в функциональности odbc. Но я не вижу, как начать настраивать это, чтобы проверить openmp и libgomp.

Ни один из пакетов R, о которых я рассказывал в этом разговоре об использовании openMP, похоже, тоже не настроен.

Так есть ли у кого-нибудь пошаговое руководство по настройке пакета R с OpenMP?

[EDIT] * * тысячу двадцать-один

Возможно, я взломал это сейчас. У меня есть скрипт configure.ac и Makevars.in с заменами @ FOO @ для параметров компилятора. Но сейчас я не уверен в рабочем процессе. Это:

  • Запустите «autoconf configure.in> configure; chmod 755 configure», если я изменю файл configure.in.
  • Сборка пакета.
  • При установке пакета система запускается для меня ./configure и создает Makevars из Makevars.in

Но для ясности, "autoconf configure.in> configure" не запускается при установке пакета - это просто процесс разработчика, который создает сценарий конфигурации, который распространяется - amirite?

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Просто ответьте на ваш вопрос об использовании autoconf - нет, вы не хотите запускать autoconf с какими-либо аргументами и не должны перенаправлять его вывод. Вы правы в том, что запуск autoconf для создания сценария настройки - это то, что сопровождающий пакета делает, и полученный сценарий настройки распространяется. Обычно, чтобы сгенерировать скрипт configure из configure.ac (старые пакеты используют имя configure.in, но это имя не рекомендуется в течение нескольких лет), разработчик просто запускает autoconf без аргументов. Перед запуском autoconf необходимо запустить aclocal, autoheader, libtoolize и т. Д. Также существует инструмент (autoreconf), который упрощает процесс и вызывает все необходимые программы в правильном порядке. Теперь более типично запускать autoreconf вместо autoconf.

1 голос
/ 15 февраля 2011

Считаете, что вы неправильно указали библиотеку, попробуйте

## -- compiling for OpenMP 
PKG_CXXFLAGS=-fopenmp
##
## -- linking for OpenMP
PKG_LIBS= -fopenmp -lgomp 

Другими словами, -lgomp связывает вас с библиотекой OpenMP. И я полагаю, вы знаете, что эта библиотека , а не является частью популярного набора Rtools для Windows. На современном Linux у вас все будет хорошо.

В не выпущенной мной тестовой упаковке я также добавляю следующее к PKG_LIBS, но это в основном из-за моего использования Rcpp:

$(shell $(R_HOME)/bin/Rscript -e "Rcpp:::LdFlags()") \
                              $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS)

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

Редактировать: SpacedMan правильный. В начале руководства libgomp-4.4:

1 Включение OpenMP

Чтобы активировать расширения OpenMP для C / C ++ и Fortran, время компиляции флаг `-fopenmp 'должен быть указан. Это включает директиву OpenMP [...] Флаг также организует автоматическое связывание Библиотека времени выполнения OpenMP.

Так что я стою исправлено. Кажется, что не мешало бы вручную добавить то, что будет добавлено, просто для ясности ...

...