프로그래밍/랩뷰 기술자료

랩뷰를 이용한 여러 CPU 병렬 실행

에이티에스 2023. 3. 28. 10:25
728x90

ㄹ여러 CPU를 가진 시스템(멀티코어, 멀티프로세서 또는 SMP 시스템으로도 불림)의 주요 장점은 멀티 스레드가 병렬로 실행될 수 있다는 점입니다. 그러므로 어플리케이션이 주로 단일 연속 프로세스로 구성되어 있는 경우, 여러 프로세서 시스템을 활용하기 어렵습니다.

그러나 파이프라인 구조를 구현하면 여러 CPU를 활용하여 단일 연속 프로세스의 작업량을 향상시킬 수 있습니다. 파이프라인은 연속적인 데이터 흐름을 보존하면서 여러 CPU에서 병렬 실행을 활용합니다.

  노트  어플리케이션에서 파이프라인을 이용하려면 CPU 사이에서 데이터 전송이 이루어져야 합니다. 이는 단순히 하나의 CPU에서 다음 작업에 데이터를 전달하는 것보다 시간이 오래 걸립니다. 그러므로 파이프라인을 구현할 경우, 병렬 프로세스로 절약되는 시간이 CPU 사이의 데이터 전송에 소요되는 시간보다 클 경우에만 VI 실행 스피드가 증가하게 됩니다.

 

파이프라인 구현

LabVIEW VI에서 파이프라인을 구현하려면 코드를 이산 단계 또는 subVI로 나누십시오. 예를 들어 한 프로세스의 처음 반을 하나의 subVI에 담고 나머지 반을 다른 subVI에 담아 복잡한 연산 프로세스를 두 개의 이산 단계로 나눌 수 있습니다. 다음 블록다이어그램에서 왼쪽은 표준 연속 구조, 오른쪽은 파이프라인 구조를 보여줍니다.

왼쪽 구조는 여러 CPU를 활용하지 않습니다. 다음 설명에서 보이는 것처럼 LabVIEW가 두 subVI 모두를 단일 CPU에서 순차적으로 실행되어야 하는 단일 실행 스레드에서 실행하기 때문입니다.

 

그러나 두 subVI를 시프트 레지스터를 통해 함께 연결하면 LabVIEW는 subVI를 파이프라인합니다. 이제 VI가 하나 이상의 CPU를 가진 시스템에서 실행될 때, SubVI는 다음 설명에서 보이는 것처럼 병렬로 실행됩니다.

  노트  파이프라인을 구현할 때, 파이프라인의 단계가 공유 리소스를 사용하지 않도록 하십시오. 공유 리소스를 동시에 요청하게 되면, 병렬 실행이 방해를 받으며 여러 CPU 시스템을 사용하는 성능상의 장점이 사라지게 됩니다.

 

파이프라인의 단계를 실행하는 CPU가 다른 태스크를 실행할 필요가 없으며 CPU 활용을 최소화하려는 경우, 파이프라인 단계의 균형을 맞춰 각 단계가 거의 같은 시간만큼 실행되도록 합니다. 하나의 파이프라인 단계가 다른 단계보다 더 오래걸릴 경우, 시간이 적게 걸리는 단계를 수행하고 있는 CPU는 시간이 많이 걸리는 단계가 끝날 때까지 기다려야 합니다.

 

파이프라인 데이터 흐름

파이프라인은 연속적인 데이터 흐름 의존성을 보존하면서 병렬 프로세싱을 활용합니다. 이전 예제의 경우, 루프의 첫번째 반복에서 subVI A가 입력 1을 처리하는 동안 subVI B는 시프트 레지스터의 기본값을 처리하므로 유효하지 않은 출력이 나옵니다. 두번째 루프 반복에서 subVI B가 첫번째 루프 반복에서 나온 subVI A의 출력을 처리하는 동안 subVI A는 입력 2를 처리합니다. SubVI B의 출력은 파이프라인이 다 채워질때까지 유효하지 않습니다. 파이프라인이 채워지면, 이후의 모든 루프 반복은 1 루프 반복만큼 계속 뒤쳐져서 유효한 출력을 냅니다.

  노트  파이프라인 실행의 초기에 발생하는 무효한 출력으로 인한 원하지 않는 동작을 방지하기 위해 주의해야 합니다. 예를 들어 케이스 구조를 사용하여 Timed 루프가 N번 반복된 후에만 작동기를 활성화할 수 있습니다.

 

일반적으로 마지막 파이프라인 단계의 출력은 파이프라인의 단계 개수만큼 입력에 뒤쳐지며 출력은 파이프라인이 꽉 찰 때까지 각 루프 반복에서 사용할 수 없습니다. 파이프라인의 단계 개수는 파이프라인 깊이라고 부르며 루프 반복으로 측정되는 파이프라인의 지연은 이 깊이에 해당합니다. 깊이가 N인 파이프라인의 경우, N번째 루프 반복까지 결과는 유효하지 않으며, 각 유효한 루프 반복은 N-1 루프 반복만큼 입력에 뒤처집니다.

  노트  병렬로 실행될 수 있는 파이프라인 단계의 개수는 사용 가능한 CPU의 갯수로 제한됩니다.

 

Timed 루프로 파이프라인 사용

(Real-Time, Windows) 각 파이프라인 단계를 특정 CPU에 지정하려 하는 경우, Timed 루프를 사용하여 파이프라인을 구현할 수 있습니다. LabVIEW는 각 Timed 루프를 단일 스레드에 맵핑하기때문에 Timed 루프 안에 시프트 레지스터를 사용하여 파이프라인을 구현할 수는 없습니다. Timed 루프로 파이프라인을 구현하려면, 각 파이프라인 단계를 병렬 Timed 루프에 넣고 , 로컬 변수, 또는 글로벌 변수를 사용하여 Timed 루프 사이에 데이터를 전달해야 합니다.

  노트  로컬이나 글로벌 변수를 사용하여 파이프라인을 구현하는 것은 어렵습니다. 로컬 및 글로벌 변수는 새로운 데이터를 기다리지 않으므로 입력을 건너뛰거나 하나의 입력에서 반복적으로 출력 결과를 낼 수도 있습니다.

 

여러 CPU를 가진 시스템의 파이프라인 - NI

728x90
반응형
그리드형