-
Использование диапазонов при задании обновляемой части массива в директивах 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 системы в соответствии с инструкцией.