Imatest IT 병렬 처리 샘플 프로젝트

소개

Imatest IT에는 이제 병렬 처리 기능이 포함되어 있습니다. 사용자가 여러 개의 동시 프로세스를 실행하여 컴퓨터의 리소스를 더욱 효율적으로 활용할 수 있도록 합니다 .

Imatest IT 에는 부모 프로세스가 분석할 이미지를 자식 프로세스 풀에 분산시키는 다중 프로세스 구성을 보여주는 추가 C++ 프로젝트가 포함되어 있습니다 . 이러한 동시 프로세스 풀을 관리하기 위해 C++ 프로젝트는 Boost.Interprocess 의 특정 유형의 프로세스 간 통신을 활용합니다. 프로세스 간 제어 객체와 공유 메모리를 사용하여 부모 프로세스는 자식 프로세스를 안전하게 관리하고 자식 프로세스가 사용 가능해지면 작업을 분산시킬 수 있습니다.

병렬 테스트를 통해 머신당 테스트 처리량을 최대 2~3배까지 늘릴 수 있습니다. 벤치마킹 세부 정보는 다음과 같습니다.

IT-P_건축2
Imatest IT를 사용한 병렬 처리 아키텍처 예시입니다. 상위 프로세스는 이미지 파일 세트를 분석 작업 세트로 구성한 다음, 이러한 작업을 하위 프로세스 풀에 분배합니다. 각 하위 프로세스는 .ini 제어 파일에 포함된 설정을 사용하여 분석을 수행하는 Imatest IT SDK 인스턴스를 포함합니다.

여러 프로세스를 실행할 때의 이점

멀티코어 시스템에서는 단일 Imatest IT 모듈을 실행하는 것만으로는 컴퓨터의 모든 리소스를 활용하지 못하는 경우가 많습니다. 여러 분석 프로세스를 병렬로 실행하면(시스템 리소스 포화점까지) 테스트 처리량, 즉 주어진 시간 내에 시스템이 수행할 수 있는 테스트 수를 늘릴 수 있습니다.

오른쪽 그래프는 한 가지 예를 보여줍니다. 이 그래프에서 컴퓨터( 인텔 i7-3930K 프로세서 - 6개의 물리적 코어 @ 3.2GHz, 16GB RAM)는 여러 개의 8MP SFRplus 이미지를 분석하면서 동시에 실행되는 SFRplus 프로세스 수를 점차 증가시켰습니다. 이 예에서 테스트 처리량은 최고점에 도달했을 때 단일 프로세스 실행 시의 처리량보다 약 3.7배 증가했습니다. 테스트 처리량은 프로세스 수가 물리적 코어 수와 거의 같아지는 지점에서 포화 상태에 도달했습니다. 처리량 향상 정도는 컴퓨터의 프로세서와 RAM 용량에 따라 달라집니다.

IT-P_blemish_8MP

고성능 데스크톱( 인텔 i7-3930K 프로세서 - 6개의 물리적 코어 @ 3.2GHz, 16GB RAM)에서 SFRplus를 사용하여 8MP 이미지를 분석하고, 동시에 실행되는 프로세스 수를 증가시켰습니다.

Imatest IT 병렬 처리 샘플 프로젝트 시작하기

배경 정보

이미지 품질 분석에는 Imatest IT/DLL이 사용되지만, 병렬 C++ 프로젝트의 프로세스 간 통신 및 동기화는 Boost Interprocess 라이브러리라는 다른 라이브러리를 통해 관리됩니다. Boost Interprocess 라이브러리는 유일한 프로세스 간 라이브러리는 아니지만, 이식성과 상대적인 단순성 때문에 선택되었습니다. 프로세스 간 통신 및 동시성에 관련된 다양한 객체를 이해하려면 Boost Interprocess 문서를 참조하십시오. 병렬 처리 시스템을 프로그래밍하려면 동시성 처리의 어려움을 이해하는 것이 필수적입니다.

설치

Imatest IT 설치가 완료되면 샘플 프로젝트는 IT 설치 디렉터리( C:\Program Files\Imatest\v5.0\IT\ ) 내의 \samples\cpp\CPP_parallel_test_project\ 하위 디렉터리에 있습니다.

Visual Studio 프로젝트

Imatest IT 설치 파일에는 Visual Studio 2008 C++ 프로젝트가 포함되어 있으며, 이 프로젝트에서는 Imatest IT 의 병렬 프로세스 풀이 파일로 저장된 일련의 이미지를 분석합니다. 이 프로세스 풀은 부모 프로세스에 의해 관리되며, 부모 프로세스는 Boost Interprocess C++ 라이브러리 v1.54의 공유 메모리와 동기화 객체를 사용하여 풀과 통신합니다. 부모 프로세스는 공유 메모리를 통해 테스트 세부 정보(예: 이미지 소스 및 sfrplus_shell() 또는 blemish_shell() 함수를 실행할지 여부)를 각 자식 프로세스에 전달합니다. 자식 프로세스는 테스트를 수행하고 추가 지시를 기다립니다. 부모 프로세스가 자식 프로세스에 더 이상 전달할 테스트가 없으면 자식 프로세스가 스스로 종료되도록 명령을 보냅니다.

특징

위시리스트

C++ 프로젝트 아키텍처

 IT-P_Boost_project

C++ 프로젝트에서 부모 프로세스는 Imatest IT/DLL 인스턴스를 각각 포함하는 세 개의 자식 프로세스 풀을 실행합니다. 테스트 데이터(즉, 이미지 파일 이름과 수행할 테스트)는 공유 메모리를 통해 자식 프로세스로 분산됩니다. 자식 프로세스는 .ini 제어 파일에서 입력된 설정을 사용하여 이미지를 분석하고 결과를 고유한 이름의 JSON 파일로 출력합니다. 각 자식 프로세스의 출력은 콘솔 창(std::cout)으로 출력될 예정이었지만, 콘솔 출력과의 충돌을 방지하기 위해 공유 메모리를 통해 부모 프로세스로 다시 리디렉션됩니다. 자식 프로세스가 이미지 분석을 완료하면 부모 프로세스로부터 추가 지시를 기다립니다.

중요 클래스 및 객체

ChildProcessSettings

이 구조체는 각 자식 프로세스와 부모 프로세스 간의 인터페이스 역할을 하며 공유 메모리에 로드됩니다. 이 구조체에는 실행할 테스트에 대한 모든 정보와 프로세스 간 뮤텍스 및 프로세스 간 조건 변수를 포함한 여러 제어 구문이 포함되어 있습니다. 참고로, Boost Interprocess 공유 메모리 객체는 표준 C++ 컨테이너를 포함할 수 없습니다. 표준 C++ 컨테이너는 공유 메모리에 할당되지 않기 때문입니다( 링크 ). 대신 Boost Interprocess 컨테이너 또는 일반 데이터 객체를 사용하십시오.

차일드핸들

이 클래스는 부모 프로세스가 자식 프로세스와 공유 메모리의 ChildProcessSettings 구조체를 더 효과적으로 제어할 수 있도록 합니다. 자식 프로세스가 부모 프로세스에 의해 종료될 때(예: 자식 프로세스가 정지된 경우) ChildProcessSettings 구조체가 저장된 공유 메모리를 삭제하고 새로운 공유 메모리 객체를 생성해야 하므로 이 클래스가 필요합니다.

SfrTestStruct

이 구조체는 특정 SFRplus 테스트에 대한 모든 정보(예: 파일 이름)를 포함합니다.

흠집 테스트 구조

이 구조체는 특정 블레미쉬 테스트에 대한 모든 정보(예: 파일 이름)를 포함합니다.

카메라 정보

이 구조체는 카메라 해상도, 일련 번호 및 부품 번호와 같은 특정 카메라에 대한 모든 식별 정보를 포함합니다.

추가 자료

  1. Boost 프로세스 간 문서 .
  2. 공유 메모리에서 매핑된 영역의 제한 사항에 대한 중요한 참고 사항: ( 링크 ).