MPI를 사용하는 코드 / 라이브러리와 호환되는 단위 테스트 프레임 워크에 대한 권장 사항이 있습니까?


13

일반적으로 시리얼 코드를 작성하고 내가 할 때 일부 xUnit 스타일 테스트 프레임 워크 (MATLAB xUnit, PyUnit / nose 또는 Google의 C ++ 테스트 프레임 워크)를 사용하여 단위 테스트를 작성합니다.

복잡한 Google 검색을 기반으로, 실무자가 MPI를 사용하는 코드를 테스트하는 방법을 많이 보지 못했습니다. 이에 대한 모범 사례가 있습니까?

단위 테스트 및 테스트 중심 개발 전략과 비교할 때 테스트 프레임 워크에 사용해야하는 소프트웨어와 관련된 답변을 찾고 있습니다 (있는 경우) 맞춤형 테스트 코드의 사례가 도움이 될 것입니다).

제가 테스트하려고하는 대부분은 반-분산 된 PDE를 통합 할 타임 스테퍼를위한 오른쪽 함수 평가와 Jacobian 행렬 어셈블리 루틴입니다. PETSc를 사용할 것이므로 PETSc에 특정한 것이 있으면 일반적인 테스트 프레임 워크 외에 도움이 될 것입니다.

설명 수정 :

예를 들어 (오른쪽 함수 평가)와 ${PETSC_DIR}/src/ts/examples/tutorials/ex2.c같은 것을 테스트하고 싶습니다.RHSFunctionRHSJacobian(자 코비안 행렬 평가). 조립 된 오른쪽과 조립 된 야 코비 행렬에 대해 알려진 값에 대해 테스트하고 있습니다. 간단한 문제 인스턴스에 대해 이러한 값을 분석적으로 얻을 수 있습니다. 이러한 함수는 다른 응용 프로그램 수준 함수를 사용하지 않는 응용 프로그램 별 함수이지만 벡터 또는 행렬 어셈블리가 함수 내에서 수행되면 (위의 연결된 PETSc 예에서와 같이) MPI를 호출 할 수 있습니다. 프로세서에서 로컬로 벡터 또는 행렬의 일부만 계산하는 함수를 작성하는 경우 병렬 프로그래밍을 처음 사용하기 때문에 전역 벡터와 전역을 생각하는 것이 더 직관적이기 때문에 가능한 경우 전역 버전을 기준으로 테스트하고 싶습니다. 행렬. 이러한 테스트는 작은 문제 크기와 적은 수의 프로세서에서 실행됩니다.

이를 수행하기위한 몇 가지 전략을 생각할 수 있습니다.

  • 이 주제에 대해 수행 한 Google 검색을 기반으로 잘 작동하지 않는 전략은 알려진 결과를 생성하고 상대 / 절대 오류를 병렬로 찾은 다음 순진한 비교를 수행하는 것입니다. 출력은 아마도 깨진 것 - 단위 테스트를 수행하는 유틸리티를 제한한다 - 왜 MPI와 "안녕, 세계"프로그램을 작성했습니다 누구나 알고있다. ( 이것은 질문을하기위한 자극이었다. ) 또한 단위 테스트 프레임 워크를 호출하는 데 약간의 까다로운 일이있는 것 같다.
  • 쓰기 (예를 들어 PETSc에서 사용하여 파일로 출력 VecView하고 MatView), 그리고 같은과 함께 알려진 출력에 대한 비교 ndiffnumdiff. 파일 비교로 단위 테스트를 수행 한 이전 경험에서 얻은이 방법에 대한 내 생각은 그것이 까다 롭고 필터링이 필요하다는 것입니다. 이 방법은 회귀 테스트에 탁월한 것처럼 보이지만 위의 유틸리티를 일반으로 대체 할 수 diff있으며 텍스트 형식 일치에 대해 걱정할 필요가 없기 때문 입니다. 나는이 전략이 WolfgangBangerth와 andybauer가 제안하는 것보다 다소 작다는 것을 모았습니다. PETSc는 또한 일부 테스트에 대해 유사한 접근 방식을 사용하는 것으로 보입니다.
  • 단위 테스트 프레임 워크를 사용하고 MPI 순위가 0 인 프로세서에 모든 것을 수집하고 프로세서 순위가 ​​0 인 경우에만 단위 테스트를 실행하도록 요청하십시오. 표준과 유사한 작업을 수행 할 수 있습니다 (아마도 더 쉬운 방법 임). 반환 된 오류는 계산에 문제가 있지만 어떤 요소에 오류가 있는지 알려주지 않습니다. 그런 다음 단위 테스트 출력이 왜곡되는 것에 대해 걱정할 필요가 없습니다. 단위 테스트 프레임 워크를 올바르게 호출하는 것만 걱정하면됩니다. PETSc는 정확한 솔루션을 사용할 수있을 때 예제 프로그램 내에서 표준 비교를 사용하는 것으로 보이지만 이러한 비교를 수행 할 때 단위 테스트 프레임 워크를 사용하지 않습니다 (필수 사항은 아님).

나는 사내 테스트 스위트에만 익숙하므로 아무 것도 추천 할 수 없습니다. 즉, 이러한 테스트 스위트 중 어느 것도 생성 한 실행 파일을 실행하는 방법을 지정할 수 있습니까? 그렇다면 MPI 프로그램에 적합한 테스트를 작성하는 것이 쉽지 않습니다.
Bill Barth

그들은해야. 이 문제는 사용하지 않는 것이어야한다, 그래서 컴파일 된 언어, 그것은 단지 실행 파일의 mpiexec실행하고, 같은 통화 포함 PETScInitialize/ PETScFinalize설치 / 해체 코드를. (아마도 PETSc를 사용하지 않았다면 사용중인 라이브러리에 따라 해당 호출을 MPI_Init/의 아날로그로 대체 할 것 MPI_Finalize입니다.) Google의 테스트 프레임 워크는 소스 기반 릴리스이므로 코드 I과 함께 컴파일합니다. 쓰기도 문제가되지 않습니다.
Geoff Oxberry

문제에 대한 설명은 단위 테스트 프레임 워크를 사용하여 통합 / 회귀 테스트를 실행하는 데 관심이 있음을 나타냅니다. 그 자체로는 아무런 문제가 없지만 질문을 좀 더 명확히하고 싶을 수도 있습니다. 과학 테스트를 위해 단위 테스트를 작성하는 방법을 단위 테스트 전문가에게 요청하면 모듈 방식으로 테스트를 작성하라고 지시합니다. 즉, 대부분의 테스트에는 적절한 MPI 호출이 없습니다.
Aron Ahmadia

좀 더 구체적으로 설명하겠습니다. 소수의 프로세서 (예 : 1-4)에서 작은 문제에 대해 테스트하고 싶었던 것은 실제로 조립 된 Jacobian 행렬이 실제로 올바른 글로벌 Jacobian을 초래하는지 여부입니다. 또한 알려진 전역 오른쪽에 대해 오른쪽 기능을 테스트하고 싶습니다. 이러한 각 테스트는 응용 프로그램 (예 : PETSc, 테스트 RHSFunctionRHSJacobian에서 ${PETSC_DIR}/src/ts/examples/tutorials/ex.2)에서 단독 으로 단일 기능 만 수행해야합니다 .
Geoff Oxberry

나는 당신이 원하는 것을하는 데 도움이되는 프레임 워크가 현재 존재하지 않는다고 생각합니다. 우리는 PyClaw에서 코를 꼬집어 몇 가지 작업을 수행했습니다 (Lisandro는 mpi4py 및 petsc4py에서 사용했습니다). mpich의 테스트 프레임 워크를 살펴 보셨습니까?
Aron Ahmadia

답변:


8

CMake / CTest 빌드 환경에서 C ++ MPI 코드를 사용하는 GoogleTest를 기쁘게 생각합니다.

  • CMake는 svn에서 googletest를 자동으로 설치 / 링크합니다!
  • 테스트를 추가하는 것은 하나의 라이너입니다!
  • 테스트 작성은 쉽습니다! (구글 모의은 매우 강력합니다!)
  • CTest는 명령 행 매개 변수를 테스트에 전달하고 데이터를 CDash로 내보낼 수 있습니다!

이것이 작동하는 방식입니다. mpi가 필요한 일련의 단위 테스트는 my_mpi_test.cpp다음과 같은 일부 파일에 기록됩니다 .

#include <gtest/gtest.h>
#include <boost/mpi.h>

/// Most testing libraries allow to define main yourself to override initialization.
int main(int argc, char* argv[]) {
    ::testing::InitGoogleTest(&argc, argv);  /// Set gtest environment
    mpi::environment env(argc, argv);  /// Set mpi environment
    return RUN_ALL_TESTS();  /// Execute all gtest tests
}

TEST(test_batch_name, test_name) {  /// Then you can create tests as usual,
  using namespace mpi;
  communicator world;  /// and use MPI inside your tests.
  /* ... test stuff here ... */
}

이 테스트를 추가하는 CMakeLists.txt는 다음과 같습니다.

add_mpi_test(my_mpi 2)  # Uses 2 MPI processes

여기서 루트 CMakeLists.txt 안에 add_mpi_testCMake 가 래핑 add_test됩니다.

function(add_mpi_test name no_mpi_proc)
  include_directories(${MY_TESTING_INCLUDES})
      # My test are all called name_test.cpp
      add_executable(${name} ${name}_test.cpp)
      add_dependencies(${name} googletest)
  # Make sure to link MPI here too:
  target_link_libraries(${name} ${MY_TESTING_LIBS})
  set(test_parameters ${MPIEXEC_NUMPROC_FLAG} ${no_mpi_proc} "./${name}")
      add_test(NAME ${name} COMMAND ${MPIEXEC} ${test_parameters})
endfunction(add_mpi_test)

이 마지막 부분은 필요하지 않지만 한 줄에 mpi 테스트를 쉽게 추가 할 수 있습니다. 그런 다음 각 테스트에 대해 MPI 프로세스의 숫자를 하드 코딩할지 또는 명령 줄 매개 변수를 통해 ctest로 읽을 지 결정할 수 있습니다.


4

테스트를 위해 CMake 도구 세트 를 사용하는 여러 MPI 사용 소프트웨어 패키지가 있습니다 . 내 머리 꼭대기에서 생각할 수있는 것은 Trilinos, VTK 및 ParaView입니다. mpirun 및 / 또는 mpiexec로 실행 파일을 시작해야한다고 가정하고 싶지 않다고 생각합니다. CMake는 필요한 경우 사용 가능한 최대 프로세스 수 및 플래그 사전 / 사후와 같은 다양한 옵션과 함께 실행 파일을 올바르게 시작하는 방법을 지정하도록 지원합니다.

다양한 NERSC 및 Argonne 슈퍼 컴퓨터에서 테스트가 실행되는 ParaView 대시 보드 의 HPC 사이트 섹션을 살펴볼 수 있습니다 . 또한 해당 머신에서 작업하기 위해 지정해야 할 대부분의 설정도 있습니다.

참조를 위해 Trilinos 대시 보드 에는 다양한 패키지가 나열되어 있으며 조직에서 인상적입니다.

전체 공개 : 저는 Kitware 직원이며 CMake는 Kitware와 관련된 오픈 소스 프로젝트 중 하나입니다.


답변 해주셔서 감사합니다! CTest를 살펴본 결과 KitWare 웹 사이트의 맨 페이지와 같은 설명 외에는 문서가 없습니다. 무료로 제공되는 자습서를 추천 할 수 있습니까?
Geoff Oxberry

CMake Wiki 에는 많은 정보가 있습니다. CMake, CTest 및 CPack에 대한 많은 자습서가 있습니다. Stack Overflow 에서 해당 응용 프로그램에 대한 대부분의 답변을 찾습니다 .
andybauer 2014 년

andybauer-답변 주셔서 감사합니다. 귀하의 답변을 편집하고 KitWare와의 제휴를 공개 하시겠습니까?
Aron Ahmadia

3

우리는 단순히 우리 자신의 코드를 다루기 만하면된다 mpirun -np .... 우리는 이전에 Makefile 기반 테스트 체계 (컴파일, 링크, 테스트 실행, 출력을 이전에 저장된 것과 비교)를 사용했으며 여기에서 찾을 수 있습니다.

문맥 상 비 MPI 대상은 다음과 같습니다.

현재 개발중인 CMake / CTest를 사용하여 내용을 다시 작성하고 있습니다.


볼프강, 답변 주셔서 감사합니다! PETSc는 비슷한 일을하는 것 같습니다.
Geoff Oxberry

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.