Дублирование типа, производного от MPI, и установка одного типа равным другому

Допустим, у меня есть тип, производный от MPI, type_a в коде Fortran. Мне нужна вторая копия, type_b. Есть ли практическая разница между

call mpi_type_dup(type_a, type_b, err)

а также

type_b = type_a ?

Я не хочу менять какие-либо «связанные ключевые значения», упомянутые в стандарте MPI.

Следует ли одному из них отдать предпочтение перед другим? Кроме того, если type_a уже зафиксировано, нужно ли мне еще фиксировать type_b?


person bob.sacamento    schedule 25.07.2019    source источник


Ответы (1)


В Фортране производным типом данных является целое число (которое абстрагируется, если вы используете привязки mpi_f08.

Если вы type_b=type_a, то вам не нужно совершать type_b перед тем, как использовать его для связи, но если вы позже call mpi_type_free(type_a), то type_b больше нельзя будет использовать.

Если вы дублируете type_a, то вы должны зафиксировать type_b, прежде чем использовать его для связи, оба типа независимы, и оба должны быть освобождены, когда они больше не нужны.

Относительно «связанных ключевых значений»

MPI_Type_dup — это конструктор типа, который дублирует существующий тип со связанными значениями ключа. Для каждого значения ключа соответствующая функция обратного вызова копирования определяет значение атрибута, связанное с этим ключом в новом коммуникаторе. Одно конкретное действие, которое может предпринять обратный вызов копирования, — удалить атрибут из нового типа данных.

Так что пока все функции обратного вызова копирования сохраняют атрибуты, эту подпрограмму можно использовать.

Если вы знаете, что type_a не будет освобождено при использовании type_b, то type_b=type_a намного проще и эффективнее.

person Gilles Gouaillardet    schedule 26.07.2019
comment
Откуда вы взяли цитату? в новом коммуникаторе выглядит неправильно, я предполагаю, что он должен читать в новом типе данных - person Ian Bush; 26.07.2019
comment
Откройте справочную страницу MPI (!) Вы хотите выпустить PR? Если нет, я буду рад сделать это и поблагодарить вас за то, что вы это заметили. - person Gilles Gouaillardet; 26.07.2019
comment
@GillesGouaillardet Очень ясно и полезно. Спасибо! - person bob.sacamento; 26.07.2019