



Next: подання Up: Здатність мови до взаємодії Previous: ініціалізація
& nbsp Contents
передача покажчиків
Покажчики передають між мовами ФОРТРАН і Сі або С ++, використовуючи явний пакувальник Сі, щоб перетворити покажчики мови ФОРТРАН до покажчиків Сі. Прямого доступу до покажчиків Сі або С ++ в мові ФОРТРАН немає. Покажчики передають між Сі і С ++, використовуючи перевантажені оператори С ++, що викликаються з коду С ++. Прямого доступу до об'єктів С ++ з Сі немає.
Сі і ФОРТРАН. Визначення типу 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.
Alex Otwagin 2002-12-10
Спонсори:
Хостинг: