일반적으로 시리얼 코드를 작성하고 내가 할 때 일부 xUnit 스타일 테스트 프레임 워크 (MATLAB xUnit, PyUnit / nose 또는 Google의 C ++ 테스트 프레임 워크)를 사용하여 단위 테스트를 작성합니다.
복잡한 Google 검색을 기반으로, 실무자가 MPI를 사용하는 코드를 테스트하는 방법을 많이 보지 못했습니다. 이에 대한 모범 사례가 있습니까?
단위 테스트 및 테스트 중심 개발 전략과 비교할 때 테스트 프레임 워크에 사용해야하는 소프트웨어와 관련된 답변을 찾고 있습니다 (있는 경우) 맞춤형 테스트 코드의 사례가 도움이 될 것입니다).
제가 테스트하려고하는 대부분은 반-분산 된 PDE를 통합 할 타임 스테퍼를위한 오른쪽 함수 평가와 Jacobian 행렬 어셈블리 루틴입니다. PETSc를 사용할 것이므로 PETSc에 특정한 것이 있으면 일반적인 테스트 프레임 워크 외에 도움이 될 것입니다.
설명 수정 :
예를 들어 (오른쪽 함수 평가)와 ${PETSC_DIR}/src/ts/examples/tutorials/ex2.c
같은 것을 테스트하고 싶습니다.RHSFunction
RHSJacobian
(자 코비안 행렬 평가). 조립 된 오른쪽과 조립 된 야 코비 행렬에 대해 알려진 값에 대해 테스트하고 있습니다. 간단한 문제 인스턴스에 대해 이러한 값을 분석적으로 얻을 수 있습니다. 이러한 함수는 다른 응용 프로그램 수준 함수를 사용하지 않는 응용 프로그램 별 함수이지만 벡터 또는 행렬 어셈블리가 함수 내에서 수행되면 (위의 연결된 PETSc 예에서와 같이) MPI를 호출 할 수 있습니다. 프로세서에서 로컬로 벡터 또는 행렬의 일부만 계산하는 함수를 작성하는 경우 병렬 프로그래밍을 처음 사용하기 때문에 전역 벡터와 전역을 생각하는 것이 더 직관적이기 때문에 가능한 경우 전역 버전을 기준으로 테스트하고 싶습니다. 행렬. 이러한 테스트는 작은 문제 크기와 적은 수의 프로세서에서 실행됩니다.
이를 수행하기위한 몇 가지 전략을 생각할 수 있습니다.
- 이 주제에 대해 수행 한 Google 검색을 기반으로 잘 작동하지 않는 전략은 알려진 결과를 생성하고 상대 / 절대 오류를 병렬로 찾은 다음 순진한 비교를 수행하는 것입니다. 출력은 아마도 깨진 것 - 단위 테스트를 수행하는 유틸리티를 제한한다 - 왜 MPI와 "안녕, 세계"프로그램을 작성했습니다 누구나 알고있다. ( 이것은 질문을하기위한 자극이었다. ) 또한 단위 테스트 프레임 워크를 호출하는 데 약간의 까다로운 일이있는 것 같다.
- 쓰기 (예를 들어 PETSc에서 사용하여 파일로 출력
VecView
하고MatView
), 그리고 같은과 함께 알려진 출력에 대한 비교ndiff
나numdiff
. 파일 비교로 단위 테스트를 수행 한 이전 경험에서 얻은이 방법에 대한 내 생각은 그것이 까다 롭고 필터링이 필요하다는 것입니다. 이 방법은 회귀 테스트에 탁월한 것처럼 보이지만 위의 유틸리티를 일반으로 대체 할 수diff
있으며 텍스트 형식 일치에 대해 걱정할 필요가 없기 때문 입니다. 나는이 전략이 WolfgangBangerth와 andybauer가 제안하는 것보다 다소 작다는 것을 모았습니다. PETSc는 또한 일부 테스트에 대해 유사한 접근 방식을 사용하는 것으로 보입니다. - 단위 테스트 프레임 워크를 사용하고 MPI 순위가 0 인 프로세서에 모든 것을 수집하고 프로세서 순위가 0 인 경우에만 단위 테스트를 실행하도록 요청하십시오. 표준과 유사한 작업을 수행 할 수 있습니다 (아마도 더 쉬운 방법 임). 반환 된 오류는 계산에 문제가 있지만 어떤 요소에 오류가 있는지 알려주지 않습니다. 그런 다음 단위 테스트 출력이 왜곡되는 것에 대해 걱정할 필요가 없습니다. 단위 테스트 프레임 워크를 올바르게 호출하는 것만 걱정하면됩니다. PETSc는 정확한 솔루션을 사용할 수있을 때 예제 프로그램 내에서 표준 비교를 사용하는 것으로 보이지만 이러한 비교를 수행 할 때 단위 테스트 프레임 워크를 사용하지 않습니다 (필수 사항은 아님).
mpiexec
실행하고, 같은 통화 포함 PETScInitialize
/ PETScFinalize
설치 / 해체 코드를. (아마도 PETSc를 사용하지 않았다면 사용중인 라이브러리에 따라 해당 호출을 MPI_Init
/의 아날로그로 대체 할 것 MPI_Finalize
입니다.) Google의 테스트 프레임 워크는 소스 기반 릴리스이므로 코드 I과 함께 컴파일합니다. 쓰기도 문제가되지 않습니다.
RHSFunction
및 RHSJacobian
에서 ${PETSC_DIR}/src/ts/examples/tutorials/ex.2
)에서 단독 으로 단일 기능 만 수행해야합니다 .