Указатели передают между языками ФОРТРАН и Си или С++, используя явный упаковщик Си, чтобы преобразовать указатели языка ФОРТРАН к указателям Си. Прямого доступа к указателям Си или С++ в языке ФОРТРАН нет. Указатели передают между Си и С++, используя перегруженные операторы С++, вызываемые из кода С++. Прямого доступа к объектам С++ из Си нет.
Си и ФОРТРАН. Определение типа MPI_Fint
предназначено
в Си/С++ для целого числа размера, который соответствует
INTEGER
языка ФОРТРАН; часто MPI_Fint
будет эквивалентен
int
.
Следующие функции предназначены в Си, чтобы преобразовать указатель коммуникатора языка ФОРТРАН (который является целым числом) к указателю коммуникатора языка Си, и наоборот.
MPI_Comm MPI_Comm_f2c(MPI_Fint comm)
Если comm
- действительный указатель языка ФОРТРАН к
коммуникатору, то MPI_Comm_f2c
возвращает действительный указатель
Си к тому же самому коммуникатору; если comm = MPI_COMM_NULL
(значение ФОРТРАНА), то MPI_Comm_f2c
возвращает нулевой указатель
Си; если comm
- недействительный указатель коммуникатора языка
ФОРТРАН, то MPI_Comm_f2c
возвращает недействительный указатель
коммуникатора Си.
MPI_Fint MPI_Comm_c2f(MPI_Comm comm)
Функция MPI_Comm_c2f
транслирует указатель коммуникатора языка Си в указатель языка ФОРТРАН того же самого коммуникатора; она отображает
нулевой указатель в нулевой указатель и недействительный указатель в
недействительный указатель.
Подобные функции предназначаются для других типов скрытых объектов.
MPI_Datatype MPI_Type_f2c(MPI_Fint datatype)
MPI_Fint MPI_Type_c2f(MPI_Datatype datatype)
MPI_File MPI_File_f2c(MPI_Fint file)
MPI_Fint MPI_File_c2f(MPI_File file)
MPl_Group MPI_Group_f2c(MPI_Fint group)
MPI_Fint MPI_Group_c2f(MPI_Group group)
MPI_Info MPI_Info_f2c(MPI_Fint info)
MPI_Fint MPI_Info_c2f(MPI_Info info)
MPI_Op MPI_Op_f2c(MPI_Fint op)
MPI_Fint MPI_Op_c2f(MPI_Op op)
MPI_Request MPI_Request_f2c(MPI_Fint request)
MPI_Fint MPI_Request_c2f(MPI_Request request)
MPI_Win MPI_Win_f2c(MPI_Fint win)
MPI_Fint MPI_Win_c2f(MPI_Win win)
Пример 4.9 Пример ниже иллюстрирует, как функция MPI языка
ФОРТРАН MPI_TYPE_COMMIT
может быть осуществлена, упаковывая
функцию MPI Си MPI_Type_commit
с упаковщиком Си, чтобы
сделать преобразования указателя. В этом примере принят ФОРТРАН-Си интерфейс, где функция языка ФОРТРАН набрана заглавными буквами, когда
упоминается от Си, и аргументы передаются через адреса.
! ПРОЦЕДУРА ЯЗЫКА ФОРТРАН
SUBROUTINE MPI_TYPE_COMMIT(DATATYPE, IERR)
INTEGER DATATYPE, IERR
CALL MPI_X_TYPE_COMMIT(DATATYPE, IERR)
RETURN
END
/* Упаковщик Си */
void MPI_X_TYPE_COMMIT(MPI_Fint *f_handle, MPI_Fint *ierr)
{
MPI_Datatype datatype;
datatype = MPI_Type_f2c(*f_handle);
*ierr = (MPI_Fint)MPI_Type_commit(&datatype);
f_handle = MPI_Type_c2f(datatype);
return;
}
Тот же самый подход может использоваться для всех других функций MPI.
Вызов MPI_xxx_f2c
(соответственно MPI_xxx_c2f
) может быть
опущен, когда указатель является OUT (соответственно IN) аргументом, а не
INOUT.
Объяснение:
Оформление обеспечивает здесь удобное решение для распространенного случая,
где используется упаковщик Си, чтобы позволить коду языка ФОРТРАН вызвать
библиотеку Си, или коду Си вызвать библиотеку языка ФОРТРАН.
Использование упаковщиков Си - более вероятно, чем использование
упаковщиков ФОРТРАН, потому что более вероятно, что переменную типа
INTEGER
можно передать в Си, чем указатель Си можно передать в
ФОРТРАН.
Возвращение преобразованного значения как значения функции, а не через список параметров, позволяет генерировать эффективный встроенный код, когда эти функции просты (например, тождество). Функция преобразования в упаковщике не захватывает недействительный аргумент указателя. Вместо этого недействительный указатель передают ниже в библиотечную функцию, которая, возможно, проверяет его входные аргументы. []
Си и С++. Интерфейс языка С++ обеспечивают функции,
перечисленные ниже для многоязыковой способности к взаимодействию. Эстафетный
<CLASS>
используется ниже, чтобы указать любое действительное
MPI скрытое имя указателя (например, Group
), кроме
специально отмеченных случаев. Для случая, где происходил класс С++,
соответствующий <CLASS>
, функции класса также предназначаются для
преобразования между полученными классами и MPI_<CLASS>
языка Си.
Следующая функция позволяет назначение от указателя MPI языка Си до указателя MPI языка С++.
MPI::<CLASS>& MPI::<CLASS>::operator=(const MPI_<CLASS>& data)
Конструктор ниже создает объект MPI С++ из указателя MPI Си. Это позволяет автоматическое преобразование указателя MPI языка Си к указателю MPI языка С++.
MPI::<CLASS>::<CLASS>(const MPI_<CLASS>& data)
Пример 4.10 Для программы Си, чтобы использовать библиотеку С++, библиотека С++ должна экспортировать интерфейс Си, который обеспечивает соответствующие преобразования перед использованием основного вызова из библиотеки С++. Этот пример показывает функцию интерфейса Си, которая использует вызов из библиотеки С++ с коммуникатором Си; коммуникатор автоматически преобразован к указателю С++, когда вызвана основная функция С++.
// Прототип библиотечной функции C++
void cpp_lib_call(MPI::Comm& cpp_comm);
// Экспортируемый прототип функции C
extern "C" void c_interface(MPI_Comm c_comm);
void c_interface(MPI_Comm c_conm)
{
// MPI_Comm (c_comm) автоматически преобразован к MPI::Comm
cpp_lib_call(c_comm);
}
Следующая функция позволяет преобразовать объекты С++ в указатели MPI языка Си. В этом случае оператор приведения перегружен, чтобы обеспечить функциональные возможности.
MPI::<CLASS>::operator MPI_<CLASS>() const
Пример 4.11 Подпрограмма библиотеки Си вызывается из программы
С++.
Подпрограмма библиотеки Си смоделирована, чтобы принимать MPI_Comm
как аргумент.
// Прототип функции Си
extern "C" {
void c_lib_call(MPI_Comm c_comm);
}
void cpp_function() {
// Создает коммуникатор C++, и инициализирует его с dup
// MPI::COMM_WORLD
MPI::Intracomm cpp_comm(MPI::COMM.WORLD.Dup());
c_lib_call(cpp_comm);
}
Объяснение: Обеспечение преобразования из Си в С++ через конструкторы и из С++ в Си через приведение позволяет компилятору делать автоматические преобразования. Вызов Си из С++ становится тривиальным, так что обеспечивается интерфейс языка Си или ФОРТРАН к библиотеке С++.[]
Совет пользователям: Обратите внимание, что операторы приведения и содействия возвращают новые указатели значения. Использование этих новых указателей как параметров INOUT затронет внутренний объект MPI, но не будет затрагивать первоначального указателя, из которого он приводился. []
Важно обратить внимание, что все объекты С++ и их соответствующие
указатели Си могут взаимозаменяемо использоваться приложением. Например,
приложение может кэшировать атрибут на MPI_COMM_WORLD
и позже
восстанавить его из MPI::COMM_WORLD
.