LabVIEW로 멀티코어 프로세서를 위한 자동화 테스트 어플리케이션 최적화하기

개요

LabVIEW는 자동화된 테스트 어플리케이션을 위한 독창적이며 사용하기 편리한 그래픽 프로그래밍 환경을 제공합니다. 그러나 또한 다양한 CPU 코어에 코드를 다이나믹하게 지정하는 LabVIEW만의 고유 기능이 있어 멀티 코어 프로세서에서 실행 속도가 향상됩니다. LabVIEW 어플리케이션이 병렬 프로그래밍 기술을 활용하기 위해 어떻게 최적화되는 지 살펴보십시오.

내용

멀티스레드 프로그래밍의 해결 과제

최근에 이르러 프로세서 기술의 새로운 혁신으로 말미암아 높은 클럭 속도에서 작동하는 CPU를 가진 컴퓨터가 사용가능하게 되었습니다. 그러나, 클럭 속도가 이론상의 한계치에 이르게 되면서 한 개가 아닌 여러 개의 프로세싱 코어를 가진 새로운 프로세서가 등장하였습니다. 새로운 멀티코어 프로세서로 자동화된 테스트 어플리케이션은 병렬 프로그래밍 기술을 사용하게 되면 최상의 성능 및 최고의 처리량을 구현합니다. UC 버클리의 Edward Lee 교수 (전자 컴퓨터 공학 박사)가 병렬 프로세싱의 장점에 대해 다음과 같이 설명합니다.

“대부분의 기술 전문가들은 무어의 법칙의 한계에 대한 해답을 점차 확산되는 병렬 컴퓨터 아키텍처에서 찾을 수 있을 것이라고 예측합니다. 컴퓨팅에서 지속적으로 성능 향상을 확보하기 위해서는 프로그램에 반드시 병렬성이 활용되어야 합니다.”

또한, 멀티 프로세서를 활용하기 위한 어플리케이션을 프로그래밍하는 것이 중대한 도전이라고 널리 알려져 있습니다. Microsoft사의 빌게이츠 회장은 이러한 힘든 과제에 대해 다음과 같이 설명합니다.

“병렬로 작동하는 프로세서의 강점을 십분 활용하기 위해서는 소프트웨어가 동시성 (concurrency)의 문제를 다루어야만 합니다. 그러나 멀티스레드 코드를 작성한 개발자들이 말하듯이 그것은 프로그래밍에 있어 매우 힘든 과제입니다.”

그러나, LabVIEW는 멀티코어 프로세서를 위한 이상적인 프로그래밍 환경입니다. 병렬 알고리즘을 생성하기 위한 직관적인 환경을 제공하며, 여러 스레드를 주어진 어플리케이션에 다이나믹하게 지정할 수 있기 때문입니다. 사실, 멀티코어 프로세서를 사용하는 자동화된 테스트 어플리케이션은 최상의 성능을 구현하기 위해 편리하게 최적화될 수 있습니다.

또한, PXI Express 모듈형 인스트루먼트는 PCI Express 버스를 통한 높은 데이터 전송 속도로 인해 본 장점을 더욱 향상시킵니다. 멀티코어 프로세서 및 PXI Express 인스트루먼트의 혜택을 얻는 두 가지 특정 어플리케이션에는 멀티 채널 신호 분석과 인라인 프로세싱 (in-line processing 또는 HIL)이 있습니다. 본 기술백서에서는 여러 가지 다양한 병렬 프로그래밍 기술에 대해 평가해보고 각 기술이 구현하는 성능 혜택에 대해 살펴보겠습니다.

병렬 테스트 알고리즘 실행

병렬 프로세싱의 혜택을 누리는 한 가지 일반적인 자동화된 테스트 어플리케이션 (ATE)은 멀티 채널 신호 분석입니다. 주파수 분석은 프로세서 집약적인 작업이므로, 테스트 코드를 병렬화하여 각 채널의 신호 프로세싱이 여러 프로세서 코어로 분산되면 실행 속도가 향상될 수 있습니다. 프로그래머의 관점에서 필요한 단 한가지 변경은 테스트 알고리즘을 재구성하는 일 뿐입니다.

이를 설명하기 위해 고속 디지타이저 두 개 채널에서 멀티 채널 주파수 분석 (퓨리에 변환, FFT)을 위한 두 개 알고리즘의 실행 시간을 비교해 보겠습니다. PXIe-5122 14 비트 고속 디지타이저의 두 개 채널은 최고의 샘플 속도 (100 MS/s)로 신호를 수집하는 데에 사용됩니다. 우선, 본 작업에 대한 LabVIEW로 작성된 종전의 시퀀스 프로그래밍 모델을 보겠습니다.

 

 

그림 1. 시퀀스 실행을 활용하는 LabVIEW 코드

블록 다이어그램에서 양 채널의 주파수 분석은 각 채널을 순서대로 분석하는 FFT Express VI에서 수행됩니다. 상기 알고리즘이 멀티코어 프로세서에서 효율적으로 실행되는 것이 사실이지만, 각 채널을 병렬로 프로세싱할 경우 알고리즘 성능이 더욱 향상됩니다.

위의 알고리즘을 자세히 분석해보면 FFT가 고속 디지타이저에서 수집하는 것보다 훨씬 더 오랜 시간이 걸리는 것을 알 수 있습니다. 각 채널을 한 번에 하나씩 패칭 (fetching)하고 두 개의 FFT를 병렬로 실행하면 프로세싱 시간이 급격히 단축됩니다. 아래에서 병렬 방식을 적용한 새로운 LabVIEW 블록 다이어그램을 보십시오.

 

 

그림 2. 병렬 실행을 활용하는 LabVIEW 코드

상기 코드에서 보듯 각 채널은 디지타이저로부터 순차적으로 패치됩니다. 여기서 두 개의 패치가 고유 인스트루먼트의 패치일 경우에는 완벽하게 병렬로 진행될 수 있습니다. 그러나 퓨리에 변환이 프로세서 집약적이므로, 신호 프로세싱을 병렬 진행함으로써 성능을 향상시킬 수도 있습니다. 결과적으로 총 실행 시간은 단축됩니다. 양쪽 실행 시간은 다음과 같습니다.

 

 

그림 3.  순차적인 실행 시간과 병렬 알고리즘 실행 시간 비교

상기 그림에서 보듯 블록의 사이즈 (패치당 샘플)가 증가할수록 병렬 실행을 통해 절약되는 프로세싱 시간도 확연합니다. 사실상, 병렬 알고리즘 방식은 대형 블록 크기의 경우 2배에 가가운 성능 향상을 불러옵니다. 아래의 그래프에서는 성능 증가의 정확한 퍼센트를 나타냅니다.

 

 

그림 4에서, 1 M 샘플 (100 Hz 해상도 대역폭)보다 큰 블록의 경우,
병렬 방식을 통해 80% 또는 그 이상의 성능 증가를 불러옵니다.

멀티코어 프로세서에서 자동화된 테스트 어플리케이션의 성능을 증대하는 일은 그리 어렵지 않습니다. 그 이유는 LabVIEW가 각 스레드를 다이나믹하게 할당하기 때문입니다. 사실상, 사용자들은 멀티스레딩을 위해 특수 코드를 생성할 필요도 없습니다. 단 최소한의 프로그래밍 변경만으로 병렬 테스트 어플리케이션은 멀티코어 프로세서로부터 혜택을 얻을 수 있습니다.

맞춤형 병렬 테스트 알고리즘 구성하기

신호 프로세싱 알고리즘을 병렬화하는 장점은 LabVIEW가 여러 코어간에 CPU 사용을 분배할 수 있다는 점입니다. 아래 그림은 CPU가 알고리즘의 각 부분을 처리하는 순서를 나타냅니다.  

 

 

그림 5.  CPU에 의한 프로세스 실행

그래프에서 보듯, LabVIEW는 대부분의 수집된 데이터를 병렬로 실행함으로써 실행 시간을 절약합니다. 병렬 프로세싱을 위한 조건으로는 LabVIEW가 각 신호 프로세싱 서브 루틴의 복사본(또는 복제)을 만들어야 한다는 점입니다. 기본값으로, LabVIEW의 여러 신호 프로세싱 알고리즘은 “재호출 실행”을 갖도록 구성됩니다. 다시 말해 LabVIEW가 각 서브 루틴의 고유 인스턴스를 다이나믹하게 할당한다는 의미입니다. (개별 스레드 및 메모리 스페이스 포함) 그 결과로, 맞춤형 서브루틴이 재호출의 방식으로 작동하도록 구성되어야 합니다. 이는 LabVIEW에서 간단한 구성 단계를 통해 가능합니다. 본 프로퍼티를 설정하기 위해 파일 >> VI 프로퍼티를 선택하고 항목에서 “실행”을 선택합니다. 그 후 아래에 나타난 것과 같이 “재호출 실행"을 선택합니다.

 

 

그림 6. LabVIEW에서 재호출 실행 구성하기

위에 나타난 간단한 단계를 따라 여러 개의 맞춤형 서브 루틴은 병렬로 실행될 수 있으며 이는 표준 LabVIEW 분석 함수와 유사합니다. 결과적으로, 자동화된 테스트 어플리케이션은 간단한 프로그래밍 기술을 통해 멀티코어 프로세서에서 향상된 성능을 구현할 수 있습니다.

Hardware-in-the-Loop (HIL) 어플리케이션 최적화

병렬 신호 프로세싱 기술을 통해 혜택을 얻는 두 번째 어플리케이션은 동시 입출력을 위해 여러 인스트루먼트를 사용하는 것입니다. 일반적으로, 이는 Hardware-in-the loop (HIL) 또는 인라인 프로세싱 어플리케이션으로 알려져 있습니다. 본 방식에서는, 신호 생성을 위해 고속 디지타이저 또는 고속 디지털 I/O 모듈이 모두 사용됩니다. 소프트웨어에서 디지털 신호 프로세싱 알고리즘이 수행됩니다. 마지막으로 결과는 또 다른 모듈형 인스트루먼트에 의해 생성됩니다. 아래에 일반적인 블록 다이어그램이 나타나 있습니다.

 

 

그림 7.  인라인 신호 프로세싱 (HIL) 블록 다이어그램

일반적인 HIL 어플리케이션에는 인라인 디지털 신호 프로세싱 (필터링, 보간 등), 센서 시뮬레이션, 맞춤 컴포넌트 에뮬레이션이 있습니다. 본 기술백서에서는 특히 인라인 디지털 프로세싱 어플리케이션을 위한 최상의 처리량 획득 기술에 대해 살펴보겠습니다.

일반적으로 두 개의 기본적인 프로그래밍 구조 즉, 단일 루프 구조와 파이프라인 멀티 루프 구조가 사용됩니다. 단일 루프 구조는 실행이 간단하며 소형 블록 크기에 적합한 낮은 대기시간을 갖추고 있습니다. 반대로 멀티 루프 구조는 멀티코어 CPU를 더욱 잘 활용할 수 있으므로 더욱 높은 처리량을 구현합니다.

기존의 단일 루프 방식을 사용하면, 고속 디지타이저 읽기 함수, 신호 프로세싱 알고리즘, 고속 디지털 I/O 쓰기는 순서대로 위치합니다. 하단의 블록 다이어그램에 나타나듯이 각 서브루틴은 LabVIEW의 데이터 흐름 프로그래밍 모델에 의해 결정되는 대로 반드시 순서대로 실행되어야 합니다.

 

 

그림 8.  루프 프로세싱을 위한 단일 루프 방식

단일 루프 구조에는 여러가지 제약이 있습니다. 각 단계가 순서대로 수행되므로 프로세서는 데이터를 처리하는 동안 인스트루먼트 I/O 수행이 제한됩니다. 본 방식에 따르면 프로세서는 한번에 하나의 함수만을 실행할 수 있기 때문에 멀티코어 CPU는 효율적으로 활용될 수 없습니다. 따라서 멀티코어 CPU의 단 하나의 코어만이 어플리케이션에 사용됩니다. 단일 루프 구조가 낮은 수집 속도에는 충분하지만 높은 데이터 처리량을 위해서는 멀티루프 방식이 필요합니다.

멀티루프 아키텍처는 각 while 루프간 데이터를 전달하기 위해 큐 구조를 사용합니다. 아래에서 큐 구조가 있는 while 루프간 데이터 흐름 프로그래밍을 설명합니다.

 

 

그림 9. 큐 구조로 인해 여러 루프에서 데이터 공유가 가능

그림에서 설명된 바와 같이 큐는 여러 루프간에 데이터 공유를 가능하게 합니다. 상기 그림은 일반적으로 생산자-소비자 루프 구조로 알려져 있는 구조입니다. 본 케이스에서  고속 디지타이저는 하나의 루프에서 데이터를 수집하고 새로운 데이터 세트를 FIFO 각 반복으로 전달합니다. 소비자 루프는 큐의 상태를 모니터하며 각 데이터 세트를 가능할 시에 디스크에 씁니다. 큐를 사용할 때 장점은 루프가 각각 독립적으로 실행할 수 있다는 점입니다. 상기 예에서 고속 디지타이저는 디스크 쓰기에 지연이 생길지라도 계속해서 데이터를 수집할 수 있습니다. 추가 샘플은 FIFO에 저장됩니다. 일반적으로 생산자-소비자 파이프라인 방식은 더욱 효율적인 프로세서 활용을 가능하게 하므로 더욱 향상된 데이터 처리량을 구현할 수 있습니다. LabVIEW는 CPU 스레드를 각 코어에 다이나믹하게 할당할 수 있기 때문에 멀티코어 프로세서에서는 이같은 장점이 더욱 부각됩니다.

인라인 신호 프로세싱 어플리케이션에서, 세 가지 독립적인 while 루프와 두 개의 큐를 사용하여 데이터를 전달할 수 있습니다. 이같은 시나리오에서 하나의 루프는 인스트루먼트에서 데이터를 수집하고, 하나는 전용 신호 프로세싱을 수행하며, 세 번째 루프는 데이터를 두 번째 인스트루먼트에 쓰게 됩니다. 아래의 LabVIEW 블록 다이어그램에 도식화되어 있습니다.

 

 

그림 10.  여러 루프 및 큐 구조가 있는 파이프라인 신호 프로세싱

상기 그림에서 볼 수 있듯이 최상위 루프는 고속 디지타이저에서 데이터를 수집하여 첫 번째 큐 구조 (FIFO)로 보내는 생산자 루프입니다. 중간의 루프는 생산자와 소비자 두 가지 역할을 수행합니다. 각 반복시, 큐 구조로부터 여러 데이터 세트를 가져와서 (소비)하여 파이프라인 방식으로 독립적으로 데이터를 처리합니다. 본 파이프라인 방식은 최대 4개의 데이터 세트가 독립적으로 처리되도록 함으로써 멀티 코어 프로세서에서 프로세싱 성능을 향상합니다. 여기서, 중간 루프는 처리된 데이터를 두 번째 큐 구조로 전달함으로써 생산자 역할도 수행합니다. 마지막으로 최하단의 루프는 프로세스된 데이터를 고속 디지털 I/O 모듈에 쓰게 됩니다.

병렬 프로세싱 알고리즘은 멀티코어 CPU에서 프로세서 활용을 향상합니다. 사실상, 총 처리량은 두 가지 요소 즉, 프로세서 활용과 버스 전송 속도에 달려 있습니다. 일반적으로 CPU 및 데이터 버스는 대형 데이터 블록을 처리할 때 가장 효율적으로 운영됩니다. 또한, 더욱 신속한 전송 시간을 갖춘 PXI Express 인스트루먼트를 사용하여 데이터 전송 시간을 더욱 단축할 수 있습니다. 결과적으로, 수집 크기에 따른 샘플 속도를 통해 최대 처리량을 설명하겠습니다. 아래의 그림의 보십시오.

 

 

그림 11. 멀티루프 처리량 vs 단일루프 구조 처리량

본 그래프에 설명된 벤치마크에서는 모두 16-비트 샘플로 진행되었습니다. 또한, 사용된 신호 프로세싱 알고리즘은 7차 차수 버터워스 저역 필터 (0.45 x 샘플 속도의 컷오프)입니다. 데이터에 설명되는 바와 같이, 4-stage 파이프라인 (멀티루프) 방식이 최고의 데이터 처리량을 구현합니다. 2-stage 신호 프로세싱 방식은 단일 루프 방식 (시퀀스) 보다 더 나은 성능을 제공하지만, 4-stage 방식보다 CPU를 효과적으로 활용하지는 않습니다. 위에 나타난 샘플 속도는 PXIe-5122 고속 디지타이저 및 PXIe-6537 고속 디지털 I/O 모듈의 입출력의 최고 샘플 속도입니다. 20 MS/s에서, 어플리케이션 버스는 총 버스 대역폭 80 MB/s에 대해 입력에 대해 40 MB/s, 출력에 대해 40 MB/s로 데이터를 전송합니다.

파이프라인 프로세싱 방식이 입출력간 지연을 유발한다는 사실을 기억하는 것 또한 중요합니다. 지연시간이 발생에는 블록 크기, 샘플 속도 등 여러 요소가 있습니다. 아래의 테이블에서는 단일 루프 및 4-stage 멀티 루프 아키텍처에서 블록 크기 및 최대 샘플 속도에 따른 측정된 지연시간을 비교합니다.

      

테이블 1,2.  단일 루프 및 4-stage 파이프라인의 지연시간 벤치마크

예상대로, CPU 사용이 100%에 가까워질수록 지연시간이 증가합니다. 이는 20 MS/s 샘플 속도의 4-stage 파이프라인에서 더욱 명확히 드러납니다. 대조적으로, 단일 루프 예에서는 CPU 사용이 50%를 초과하지 않습니다.

결론

PXI 및 PXI Express 모듈형 계측기와 같은 PC 기반의 계측은 멀티코어 프로세서 기술 및 향상된 데이터 버스 속도로 인한 최상의 혜택을 얻고 있습니다. 새로운 CPU가 여러 개의 프로세싱 코어를 추가하여 성능이 향상됨에 따라, 병렬 또는 파이프라인 프로세싱 구조가 CPU 효율성을 극대화하는 데에 필수적인 요소가 되고 있습니다. LabVIEW는 각 프로세싱 코어에 프로세싱 태스크를 다이나믹하게 할당하기 때문에 프로그래밍 관련 애로 사항을 해결하는 데에 최적의 솔루션을 제공합니다. 상기 데이터에서도 볼 수 있듯이, 병렬 프로세싱을 활용하기 위해 LabVIEW 알고리즘을 구축함으로써 최대의 성능 향상을 확보할 수 있습니다.