Функции Python unittest C / Fortran MPI, приводящие к вызову функции MPI_Init после MPI_finalize

2
Gajanan 2020-07-21 11:34.

Я пишу оболочки Python для библиотеки Fortran, которая использует MPI (OpenMPI, если это необходимо). Проблема, о которой я здесь упоминаю, также возникает именно с оболочками Python для библиотек C. Я должен использовать встроенный unittestпакет Python для тестирования интерфейса Python.

У меня есть следующий MWE, который пытается найти максимальное и минимальное целое число для всех процессоров. Вот файл Fortran:

! File mpitest.F90
module mpitest
    implicit none
    include "mpif.h"
    integer nranks
    integer rank

    contains

    !--------------------------------------------------!
    subroutine pympitest_init()
        implicit none
        integer ierror
        call MPI_INIT(ierror)
        call MPI_COMM_SIZE(MPI_COMM_WORLD, nranks, ierror)
        call MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
    end subroutine pympitest_init

    !--------------------------------------------------!
    subroutine get_max_integer(inint, outint)
        implicit none
        integer, intent(in) :: inint
        integer, intent(out) :: outint
        integer ierror
        call mpi_allreduce(inint,outint,1,mpi_integer,mpi_max,MPI_COMM_WORLD,ierror)
    end subroutine get_max_integer

    !--------------------------------------------------!
    subroutine get_min_integer(inint, outint)
        implicit none
        integer, intent(in) :: inint
        integer, intent(out) :: outint
        integer ierror
        call mpi_allreduce(inint,outint,1,mpi_integer,mpi_min,MPI_COMM_WORLD,ierror)
    end subroutine get_min_integer

    !--------------------------------------------------!
    subroutine pympitest_final()
        integer ierror
        call mpi_finalize(ierror)
    end subroutine pympitest_final

end module mpitest

Ниже приведен файл модульного теста Python с некоторыми вещами, которые я пробовал, но не помогаю добавить в качестве комментариев:

#!/usr/bin/env python3
# Python file test_pympitest.py
from __future__ import print_function
import unittest
import numpy as np

from pympitest import mpitest as pm

#--------------------------------------------------------------------#
class Test_Fortran_MPI_functions(unittest.TestCase):
    """Unit test template for testing MPI functions."""

    #----------------------------------------------------------------#
    #def __init__(self):
    #    """Try MPI_Initialize -- Does not help."""
    #    print("Initializing MPI")
    #    pm.pympitest_init()

    #----------------------------------------------------------------#
    #def tearDown(self):
    #    """Try MPI_Finalize -- Does not help."""
    #    print("Finalizing MPI")
    #    pm.pympitest_final()

    #----------------------------------------------------------------#
    def setUp(self):
        """Initialize the unit test."""
        print("Initializing MPI")
        pm.pympitest_init()

        # We'll just test min. and max. of ranks across all PEs.
        self.inint = pm.rank

    #----------------------------------------------------------------#
    def tearDown(self):
        """Finalize the unit test."""
        print("Finalizing MPI")
        pm.pympitest_final()

    #----------------------------------------------------------------#
    #----------------------------------------------------------------#
    # Two Tests. If you comment out any one of the tests, then the
    # unit test runs fine. Keeping both uncommented thorws error
    # saying MPI_Init was called after MPI_Final, obviously since
    # the setUp and tearDown functions are called every time.
    #----------------------------------------------------------------#
    def test_get_min_integer(self):
        """Test get_min_integer function."""
        minint = pm.get_min_integer(self.inint)
        print("Minimum on processor {} = {}".format(pm.rank,minint))
        self.assertEqual(minint, 0)

    #----------------------------------------------------------------#
    def test_get_max_integer(self):
        """Test get_max_integer function."""
        maxint = pm.get_max_integer(self.inint)
        print("Maximum on processor {} = {}".format(pm.rank,maxint))
        self.assertEqual(maxint, pm.nranks-1)

#--------------------------------------------------------------------#
if __name__ == "__main__":
    unittest.main()

    # Tried the following. Does not help:
    # Calls MPI_Initialize but exits without calling MPI_Finalize.
    #print("Initializing MPI")
    #pm.pympitest_init()
    #unittest.main()
    #print("Finalizing MPI")
    #pm.pympitest_final()

Fortran код обернут в модуль Python называется , pympitestиспользуя f2py, например , так: f2py --f90exec="mpif90" -DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION -c mpitest.F90 -m pympitest. Тест прибор работает на 4 процессорах следующим образом: mpirun -np 4 python test_pympitest.py.

Я хочу сохранить все модульные тесты MPI в одном файле Python. В различных вещах, которые я пробовал (см. Комментарии в файле Python), проблема, с которой я столкнулся, заключается в том, что MPI_Initialize и MPI_Finalize либо вызываются несколько раз за один запуск, либо вызывается только один из них, все из которых выходят с ошибка.

Как мне исправить это, чтобы модульные тесты проходили правильно?


Изменить (дополнение): Помещение функций тестирования в отдельные Test_...(unittest.TestCase)классы в одном файле Python также не помогает. Разделение модульных тестов MPI на разные файлы и попытки python -m unittest discoverне работают, что неудобно. Тестирование одной обернутой функции MPI для каждого файла Python и индивидуальный запуск каждого файла Python будет работать, но этого я бы предпочел избежать.

1 answers

1
John Bollinger 2020-07-21 12:01.

Эти setUp()и tearDown()Методы unittest.TestCaseобеспечения в-тест-метод установки и демонтажа. Следует ожидать, что первый выполняется перед каждым методом тестирования, а второй - после каждого.

Кажется, вместо этого вы хотите, чтобы они выполнялись один раз для всей коллекции тестовых методов в классе. Для этого вам нужны setUpClass () и tearDownClass () . В качестве альтернативы, если вы определяете несколько тестовых классов, вы можете предпочесть setUpModule()и tearDownModule().

В качестве альтернативы вы можете создать unittest.TestSuiteподкласс, с помощью которого будут запускаться ваши тесты, и переопределить его run()метод, чтобы выполнить единовременную настройку и демонтаж.

Related questions

MORE COOL STUFF

Яна Дуггар: все, что она говорила о любви и ее 5-летнем окне, чтобы найти «того самого»

Яна Дуггар: все, что она говорила о любви и ее 5-летнем окне, чтобы найти «того самого»

Яна Дуггар открыто говорила о своих поисках любви. Вот все, что она сказала на эту тему и о своем пятилетнем окне для замужества.

Сэм Хьюэн точно знает, что он возьмет из съемочной площадки «Чужестранки»: «Я чувствую себя Джейми, когда надеваю их»

Сэм Хьюэн точно знает, что он возьмет из съемочной площадки «Чужестранки»: «Я чувствую себя Джейми, когда надеваю их»

Звезда «Чужестранки» Сэм Хьюэн недавно рассказал, что он возьмет со съемочной площадки, чтобы вспомнить Джейми Фрейзера, роль, которая сделала его звездой.

Ранняя песня Beatles, которая вошла в число «самых захватывающих выступлений» группы, по мнению инсайдера Fab Four

Ранняя песня Beatles, которая вошла в число «самых захватывающих выступлений» группы, по мнению инсайдера Fab Four

«She Loves You» была написана за час, записана за день и стала песней The Beatles с одним из лучших исполнений в их карьере.

Долли Партон помогла своей «инвалидной» бабушке, когда ни один из других внуков не стал бы — она тоже разыгрывала ее

Долли Партон помогла своей «инвалидной» бабушке, когда ни один из других внуков не стал бы — она тоже разыгрывала ее

У Долли Партон и ее бабушки Бесси были особые отношения. Бабушка Партон была очень больна, но это не мешало Долли разыгрывать ее.

Какая древесина самая твёрдая в мире?

Какая древесина самая твёрдая в мире?

Вы можете подумать, что дуб или гикори — прочные породы дерева, но когда речь идет о самой твердой древесине в мире, они даже близко не стоят.

10 самых страшных морских существ, скрывающихся в глубинах океана

10 самых страшных морских существ, скрывающихся в глубинах океана

Океан полон красоты, но он также скрывает одних из самых страшных морских существ на планете. Многие из этих животных скрываются глубоко под поверхностью океана, в тёмном, полном давления мире морских глубин.

10 лучших чар для мечей в Minecraft

10 лучших чар для мечей в Minecraft

Если вы сражаетесь с враждебными мобами или готовитесь к PvP-боям, знание лучших чар для мечей в Minecraft может дать вам серьёзное преимущество. Зачарование мечей позволяет наносить больше урона, увеличивать количество выпадающих мобов и продлевать срок службы меча.

13 социалистических стран, которые сильно отличаются друг от друга

13 социалистических стран, которые сильно отличаются друг от друга

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

Резюме «Медведя»: Маркус — самый добрый, мягкий и искренний человек в Чикаго?

Резюме «Медведя»: Маркус — самый добрый, мягкий и искренний человек в Чикаго?

В «Детях» появится громкая камео и несколько разрушительных новостей

За 9800 долларов вы бы упаковали их в эту семиместную Toyota RAV4 2008 года выпуска?

За 9800 долларов вы бы упаковали их в эту семиместную Toyota RAV4 2008 года выпуска?

Утверждается, что этот RAV4 находится в отличном состоянии и готов к игре в музыкальные стулья.

Фургон доставки Amazon загорелся в результате огненного взрыва во время летней жары в Хьюстоне

Фургон доставки Amazon загорелся в результате огненного взрыва во время летней жары в Хьюстоне

На кадрах, снятых с дрона, видно, как пожарные изо всех сил пытаются потушить пламя.

«Шоу Черной Пантеры» от Marvel станет самым важным анимационным шоу за всю историю

«Шоу Черной Пантеры» от Marvel станет самым важным анимационным шоу за всю историю

«Глаза Ваканды» напрямую связаны с MCU, а также обновления о «Людях Икс '97», «Что, если...», «Сорвиголова» и многом другом.

История знакомств Авы Гарднер: взгляд назад на браки и романы голливудской иконы

История знакомств Авы Гарднер: взгляд назад на браки и романы голливудской иконы

Ава Гарднер была замужем за Микки Руни и Фрэнком Синтрой, и встречалась с несколькими другими голливудскими звездами. Вот взгляд назад на историю знакомств Авы Гарднер.

Кто жена Джона Клиза? Все о Дженнифер Уэйд

Кто жена Джона Клиза? Все о Дженнифер Уэйд

Джон Клиз женился на Дженнифер Уэйд в 2012 году. Вот все, что нужно знать о жене Джона Клиза, Дженнифер Уэйд.

Кто муж Эллисон Феликс? Все о Кеннете Фергюсоне

Кто муж Эллисон Феликс? Все о Кеннете Фергюсоне

Олимпийская чемпионка Эллисон Феликс вышла замуж за своего мужа Кеннета Фергюсона в 2018 году. Вот все, что нужно знать о муже Эллисон Феликс, Кеннете Фергюсоне.

Кто муж Мены Сувари? Все о Майкле Хоупе

Кто муж Мены Сувари? Все о Майкле Хоупе

Мена Сувари замужем за своим мужем Майклом Хоупом с 2018 года. Вот все, что нужно знать о муже Мены Сувари.

местоимения очень страшные

Это поражает меня Внезапно, как это часто бывает, Это снова и снова на полпути <Нет, не то, что в Тихом океане, ты темно-бордовый, то, что на карнавале> Каждый громкий заголовок…..

3 проверенных способа улучшить свои навыки письма

Преимущества письма и стратегии, которые помогут вам в этом

3 проверенных способа улучшить свои навыки письма

В 2022 году, с выпуском GPT-3, навыки письма, кажется, стали менее важными. С помощью ИИ люди с плохим письмом также могут генерировать качественный персонал.

Медленная эрозия: раскрытие того, как люди угасают в своей карьере

Медленная эрозия: раскрытие того, как люди угасают в своей карьере

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

Что делает подкаст влиятельным?

Что делает подкаст влиятельным?

На прошлой неделе я заметил пресс-релиз, разосланный через PressGazette (новостной веб-сайт британских СМИ). В статье сообщалось, что Acast, скандинавская компания по размещению и рекламе подкастов, возглавит консорциум «вероятно, самых влиятельных» издателей подкастинга.

Language