CP2K: квантовая химия "для кающихся грешников"(с) Разгребаюсь потихоньку с CP2K.
Совершенно примечательная программа для квантовохимических расчетов. Свободная и бесплатная, от перечня возможностей начинается бурное слюноотделение, но уровень документирования... просто катастрофически ужасен. Есть reference manual с кратким описанием параметров, есть набор собственных тестов, несколько туториалов и упражнений по отдельным вопросам, плюс гугл-группа (весьма живая). Влазить в этот трэш без предварительного опыта с какой-нибудь более вменяемой программой настоятельно не рекомендуется.
Ну а я попробую изобразить небольшую серию постов с примерами и объяснениями, по мотивам и итогам, может кому поможет.
Итак, для начала о том, как
поставить это себе на комп.
В Debian и особо мною любимом LMDE делается, как и полагается, линейно через apt-get install cp2k (cp2k есть в стандартном репозитории Debian).
Однако, если нужна более свежая версия (в том числе экспериментальная), а также если хочется использовать CUDA (да, cp2k это умеет), то нужно
ставиться из исходников.
В системе нужно поставить следующие пакеты:
subversion gfortran gcc make libopenblas-dev libfftw3-dev libint-dev libxc-dev g++ (названия указаны для пакетной базы Debian, все присутствуют в репозитории. UPD 16.01.2016: добавил
g++). Для CUDA нужен также
nvidia-cuda-toolkit. На самом деле часть этих пакетов опциональна, кроме того, можно использовать еще некоторые дополнительные библиотеки, которых нет в репозитории --- я перечислил все, что можно выжать из обычного репозитория Debian.
Отдельное замечание о libopenblas-dev: при установке этот пакет через механизм
update-alternatives изменяет конфигурацию системы таким образом, чтобы функции динамически подключаемой библиотеки BLAS на системе выполняла именно OpenBLAS. Если вы устанавливали OpenBLAS ранее или пользуетесь другими библиотеками ---
трахайтесь с компиляцией самивнимательно настройте параметры под себя.
Инструкции по получению исходников приведены на оф.сайте:
http://www.cp2k.org/download Для получения текущей экспериментальной версии нужно выполнить команду
svn checkout http://svn.code.sf.net/p/cp2k/code/trunk cp2kНастройка параметров компиляции производится с помощью файлов в подкаталоге cp2k/cp2k/arch полученного дерева исходников. Название файла в этом каталоге соответствует представляемой им "платформе" --- важнейшим параметрам системы: ОС, компилятор, набор инструкций процессора, а также способ параллелизации. CP2K поддерживает параллельность через MPI и через OpenMP, а также через комбинацию двух этих вариантов. По опыту работы на однопроцессорных многоядерных системах --- OpenMP в CP2K работает быстрее и [естественно] жрет меньше памяти, чем MPI. Потому править будем файл
Linux-x86-64-gfortran.ssmp.
Мой конфиг, удачно прошедший компиляцию, выглядит так:
Без CUDA:
CC = gcc
CPP =
FC = gfortran
LD = gfortran
AR = ar -r
OPENBLAS_INC = /usr/include/openblas
OPENBLAS_LIB = /usr/lib
GCC_DIR=
FFTW_INC = /usr/include
FFTW_LIB = /usr/lib/x86_64-linux-gnu
LIBINT_INC = /usr/include/libint
LIBINT_LIB = /usr/lib
DFLAGS = -D__FFTW3 -D__LIBINT\
-D__LIBINT_MAX_AM=7 -D__LIBDERIV_MAX_AM1=6 -D__MAX_CONTR=4
#-D__PW_CUDA
CPPFLAGS =
FCFLAGS = $(DFLAGS) -O2 -ffast-math -ffree-form -ffree-line-length-none\
-fopenmp -ftree-vectorize -funroll-loops\
-mtune=native\
-I$(OPENBLAS_INC) -I$(FFTW_INC) -I$(LIBINT_INC)
LDFLAGS = $(FCFLAGS) -static-libgfortran
LIBS = $(OPENBLAS_LIB)/libopenblas.a\
$(FFTW_LIB)/libfftw3.a\
$(FFTW_LIB)/libfftw3_threads.a\
$(LIBINT_LIB)/libderiv.a\
$(LIBINT_LIB)/libint.a
С CUDA:
CC = gcc
CPP =
FC = gfortran
LD = gfortran
AR = ar -r
OPENBLAS_INC = /usr/include/openblas
OPENBLAS_LIB = /usr/lib
GCC_DIR=
FFTW_INC = /usr/include
FFTW_LIB = /usr/lib/x86_64-linux-gnu
LIBINT_INC = /usr/include/libint
LIBINT_LIB = /usr/lib
DFLAGS = -D__FFTW3 -D__LIBINT\
-D__LIBINT_MAX_AM=7 -D__LIBDERIV_MAX_AM1=6 -D__MAX_CONTR=4
CPPFLAGS =
FCFLAGS = $(DFLAGS) -O2 -ffast-math -ffree-form -ffree-line-length-none\
-fopenmp -ftree-vectorize -funroll-loops\
-mtune=native\
-I$(OPENBLAS_INC) -I$(FFTW_INC) -I$(LIBINT_INC)
LDFLAGS = $(FCFLAGS) -static-libgfortran
LIBS = $(OPENBLAS_LIB)/libopenblas.a\
$(FFTW_LIB)/libfftw3.a\
$(FFTW_LIB)/libfftw3_threads.a\
$(LIBINT_LIB)/libderiv.a\
$(LIBINT_LIB)/libint.a
NVCC = /usr/bin/nvcc
DFLAGS += -D__ACC -D__DBCSR_ACC -D__PW_CUDA
NVFLAGS = $(DFLAGS) --gpu-architecture=compute_30
CUDAPATH = /usr/lib/x86_64-linux-gnu
LIBS += -L$(CUDAPATH) -lcudart -lcublas -lcufft -lrt
Особо обращаю внимание, что
$NVFLAGS обязательно должны содержать
$(DFLAGS) --- инструкции по сборке этого не упоминают, но без этого компиляция не удастся.
Поместив нужный файл в подкаталог
cp2k/cp2k/arch, переходим в подкаталог
cp2k/cp2k/makefiles и выполняем
make ARCH=Linux-x86-64-gfortran VERSION=ssmpЕсли используете версию с CUDA, я бы рекомендовал отдельно собрать версию без CUDA, и держать рядом на всякий случай. Например, на карте с 1 Гб видеопамяти CP2K периодически ругается на невозможность выделить видеопамять и вылетает, приходится запускать без GPU. Названия версий стандартные, но принципиально не ограничены --- скажем, для конфигурации без CUDA можно создать конфигурационный файл
Linux-x86-64-gfortran.ssmpnc (nc всмысле no-CUDA) или как-то так.
Результат компиляции будет в подкаталоге
cp2k/cp2k/exe, там будет ряд файлов, реально нужен только
cp2k.ssmp (ну и
cp2k.ssmpnc), который можно копировать куда угодно и использовать.
Отдельное замечание об очистке каталога при неудачной сборке. Авторы наделали много разных опций для очистки, до конца там не совсем понятно, что следует использовать в каких случаях, я использую
make clean ; make veryclean ; make realclean ; make distclean --- упорото, но вроде работает.