-
Использование диапазонов при задании обновляемой части массива в директивах actual/get_actual в CDVMH
В директивах актуализации данных помимо указания всего массива целиком
#pragma dvm actual(A)можно дополнительно указать диапазон обновляемых элементов, например,#pragma dvm actual(A[0:1]). В этом случае обновление на устройстве или хосте произойдет только для элементов указанного диапазона, при этом правая граница диапазона включается в набор обновляемых элементов (в примере выше, для обновления на устройство будут помечены элементыA[0]иA[1]. -
Сложные выражения в правилах выравнивания CDVMH
Компилятор CDVMH в данный момент допускает правила выравнивания строго в форме
a*i+b. При этом порядок слагаемых важен, индексная переменнаяiне может размещаться в скобках, а коэффициентaи свободный членbдолжны быть единым выражением. Таким образом, еслиaилиbне являются неотрицательными константами, то их необходимо поместить внутрь скобок(...).Например, корректная запись директивы должны иметь вид:
#pragma dvm parallel ([i][j][k] on A[(-1) * i + (L-2)][j][k])В этом случае
aполучает значение-1, аbполучает значениеL-2.Следующие директивы ошибочны:
// Ошибка выполнения программы - неправильная запись правила выравнивания. #pragma dvm parallel ([i][j][k] on A[L-2-(i)][j][k])Все выражение
L-2-(i)будет рассматриваться компилятором как одно выражение (инвариантное для цикла) в правиле выравнивание,iиндексная переменная не будет обнаружена и выравнивания на итерацию цикла не будет. При этом такая программа может компилироваться успешно, но работать будет некорректно.// Ошибка компиляции программы - неправильная запись правила выравнивания. #pragma dvm parallel ([i][j][k] on A[L-2-i][j][k]Будет выдана синтаксическая ошибка разбора данного выражения вида
error #3431: Syntax error in mapping specification. Invalid axis mapping rule at column .... -
Ошибка компиляции Fortran-DVMH программы: несоответствие фактических и формальных аргументов
При использовании современных версий Фортран компилятора GNU (gfortran) для компиляции DVMH программ возможно возникновение ошибок аналогичных следующей:
Error: Type mismatch between actual argument at (1) and actual argument at (2) (INTEGER(4)/INTEGER(8)). jac.DVMH.f:41:25: 34 | dvm000(2) = getai (dvm000(1)) | 2 ...... 41 | dvm000(9) = getai (i0000m(1))Данная ошибка связана с тем, что некоторые функции системы поддержки DVMH могут быть вызваны с разным числом параметров разных типов. Современные компиляторы пытаясь гарантировать корректность вызова функций могут запрещать такое поведение. Чтобы данные ошибки трактовались компилятором как предупреждения можно добавить опцию
-fallow-argument-mismatch.Допустим один из двух вариантов.
Можно в скрипте
dvmраскомментировать и изменить переменнуюPFORT:export PFORT='mpifort -g -O2 -fopenmp -fallow-argument-mismatch'Иди можно задать переменную
PFORTв файле, определяющем конфигурацию сборки DVM системы. Имя конфигурации указано в файле…/dvm_sys/platform. Файл, совпадающий с именем конфигурации, необходимо найти директории…/dvm_sys/platforms. Необходимо внести изменения в данный файл:PFORT='mpifort -g -O2 -fopenmp -fallow-argument-mismatch' -
Ошибка установки и/или использования DVM системы с использованием MPICH и GCC
При одновременном использовании MPICH реализации MPI совместном с компилятором GCC возможно возникновение ошибок компоновки при сборке DVM системы и/или при компиляции DVMH программ. Ошибка связана с тем, что скрипт
mpiccиmpicxxзапускают компилятор GCC с включенной межмодульной оптимизацией (-lto=auto), при этом компилятор не справляется с оптимизацией системы поддержки DVM системы совместно с компилируемой программой.Возможным решением может быть отключение межмодульной оптимизации, в этом случае в конфигурации сборки системы для всех компиляторов нужно задать
-fno-lto.Имя конфигурации указано в файле
.../dvm_sys/platform. Файл, совпадающий с именем конфигурации, необходимо найти в директории.../dvm_sys/platforms. Необходимо внести изменения в данный файл и привести его к виду аналогичному следующему:CC='gcc -g -O2 -fno-lto' CXX='g++ -g -O2 -fno-lto' LINKER='g++ -g -fno-lto' ... PCC='mpicc -g -O2 -fopenmp -fno-lto' PCXX='mpic++ -g -O2 -fopenmp -fno-lto' PFORT='mpifort -g -O2 -fopenmp -fallow-argument-mismatch -fno-lto' PLINKER='mpic++ -g -fopenmp -fno-lto' PFLINKER='mpifort -g -fopenmp -fno-lto' ... NVCC='/usr/bin/nvcc -std=c++11 -Xcompiler -fno-lto' ... -
Ошибка компиляции CDVMH программ: не удается найти компилятор c_dvmh
Данная ошибка связана с тем, что в процессе сборки DVM системы по какой-то причине не был собран конвертер СDVMH программ (
c_dvmh).../dvm_sys/bin/dvm_utils.sh: line 66: c_dvmh: command not foundИсполняемый файл конвертера после сборки должны располагаться в директории
bin, в которую выполнялась установка DVM системы. В данном примере это.../dvm_sys/bin.Для сборки C DVMH конвертера необходимо наличие установленных библиотек Clang, одной из поддерживаемых версий. Важно, чтобы были установлены библиотеки разработчика, которые обычно имеют суффикс
devв названии.Также стоит проверить конфигурацию сборки DVM системы. Имя конфигурации указано в файле
.../dvm_sys/platform. Файл, совпадающий с именем конфигурации, необходимо найти в директории.../dvm_sys/platforms. В данном файле необходимо проверить корректность задания переменнойLLVMCONFIG, в которой должен быть указан путь до программыllvm-config, соответствующей используемой версии LLVM и Clang, например,LLVMCONFIG=llvm-config-17(в этом случае путь доllvm-config-17должен быть добавлен в переменную окруженияPATH).После установки нехватающих библиотек и исправления конфигурации сборки необходимо повторить сборку DVM системы в соответствии с инструкцией.