콘텐츠로 바로 가기

파이프라인 개념#

이 항목에서는 ‘ VisualApplets ’ 설계에서 생성된 FPGA 하드웨어를 통해 이미지 데이터가 어떻게 이동하는지 설명합니다. 이 항목을 읽은 후에는 설계 내의 모듈과 링크가 어떻게 파이프라인 구조를 형성하는지, 데이터가 파이프라인에 어떻게 유입되고 유출되는지, 대부분의 단계에서 데이터가 즉시 전달되는 이유, 동시 FPGA 처리가 처리량에 미치는 영향, 그리고 어떤 링크 속성이 데이터 전송 속도를 제한하는지 이해할 수 있습니다.

정식 데이터 흐름 모델에 대해서는 사용자 설명서의 ‘데이터 흐름’ 항목을 참조하십시오. 설계를 처음부터 끝까지 구축하고 검증하는 방법에 대해서는 ‘빈 설계에서 실행 가능한 애플릿까지’ 튜토리얼 항목을 참조하십시오.

VisualApplets 설계는 연산자 라이브러리에 포함된 연산자들을 사용하여 구축합니다. 배치된 각 연산자 인스턴스는 모듈입니다. 모듈은 입력 및 출력 포트를 노출합니다. 포트는 링크로 연결됩니다. 다이어그램에서는 각 링크가 화살표로 표시됩니다.

VisualApplets 설계 내의 모듈과 링크는 서로 결합되어 이미지 처리 파이프라인을 구성합니다. 이 빌드는 해당 그래프를 프레임 그래버 FPGA상의 하드웨어 단계로 구현합니다. 처리 순서는 연결 순서를 따릅니다. 분기 및 병합은 그래프 내의 병렬 경로와 재결합 지점을 정의합니다.

분기점과 병합 지점이 있는 파이프라인

각 모듈은 입력 데이터가 제공되는 즉시 처리를 시작합니다. 계산이 완료되고 출력이 차단되지 않은 경우, 해당 모듈은 결과 데이터를 출력 링크를 통해 전달합니다. 실행 시 이 동작은 VisualApplets 에 있는 그래픽 심볼이 아닌, 모듈에서 생성된 FPGA 로직에 의해 구현됩니다. 따라서 파이프라인 구조는 데이터가 분할되는 위치, 재결합되는 위치, 그리고 어떤 연산자가 직렬로 또는 병렬로 실행되는지를 정의합니다.

픽셀은 한 번에 완성된 이미지 형태로 프레임 그래버로 입력되지 않습니다. 카메라가 픽셀을 하나씩 차례로 수집 경로로 전송하거나, 애플릿 내부의 이미지 소스가 픽셀을 하나씩 생성합니다. 그런 다음 해당 픽셀들은 동일한 순서대로 파이프라인 단계를 거치게 됩니다:

파이프라인을 통과하는 픽셀

핵심 용어

픽셀을 도로 위의 자동차라고 생각해 보세요. 자동차들은 길을 따라 서로 뒤를 이어 달립니다. 어느 순간이든, 각기 다른 자동차(픽셀)들은 도로(파이프라인 단계)의 서로 다른 위치에 있습니다. 도로 그 자체는 ‘ VisualApplets ’ 설계에서 여러분이 연결한 파이프라인 구조입니다. 빌드 후에는 그 도로가 ‘ VisualApplets ’ 편집기 내부의 경로가 아니라, 프레임 그래버 FPGA 상의 하드웨어가 됩니다.

이 비유에서 병렬 처리는 도로의 차선 수에 비유할 수 있습니다. 차선이 많을수록 더 많은 자동차(픽셀)가 동시에 앞으로 나아갈 수 있습니다.

파이프라인의 입력 및 출력#

모든 파이프라인에는 설계에 데이터를 공급하는 소스(source)가 적어도 하나 있고, FPGA 처리 경로를 떠나는 싱크(sink)가 하나 이상 있습니다. 소스와 싱크는 대개 M형 연산자입니다. 사용 가능한 연산자는 대상 하드웨어 플랫폼에 따라 다릅니다.

Inputs#

데이터는 다음과 같은 방식으로 파이프라인에 입력될 수 있습니다:

  • 카메라 또는 기타 이미지 소스에서: 플랫폼별 카메라 제어 프로그램이 연결된 카메라에서 나오는 연속적인 픽셀 스트림을 수집 경로로 전달합니다.
  • 애플릿 내에서 생성됨: 다음과 같은 연산자 CreateBlankImage 또는 CoefficientBuffer 라이브 카메라 없이 이미지 데이터를 생성하거나 재생합니다. 이러한 소스는 테스트 패턴, 호스트에서 업로드된 참조 데이터, 또는 카메라에서 영상을 가져오지 않는 디자인에 사용됩니다.

신호 경로는 디지털 입력에서 시작될 수도 있습니다(예를 들어, 다음을 통해 GPI) 또는 애플릿 내부 신호 생성기에서 발생합니다. 흐름 제어 하에서 카메라 소스가 중지 가능한 애플릿 내부 소스와 어떻게 다른지에 대해서는 다음을 참조하십시오. 중지 가능 및 중지 불가능 데이터 스트림 튜토리얼 항목.

Outputs#

처리된 결과는 다음과 같은 방식으로 파이프라인을 떠날 수 있습니다:

  • 호스트에 대한 DMA: DmaToPC 연산기는 직접 메모리 액세스(DMA)를 통해 이미지 데이터를 호스트 PC의 메모리로 전송합니다. 이는 호스트 소프트웨어에서 처리된 이미지를 가져오는 일반적인 경로입니다.
  • GPO를 통한 신호: GPO 이 연산자는 프레임 그래버의 디지털 출력 핀을 제어합니다. 호스트 PC 외부의 트리거, 상태 또는 기타 하드웨어 제어 신호에 이 경로를 사용하십시오.
  • 주최자에게 보내는 행사 안내: EventToHost 및 EventDataToHost 오퍼레이터는 소프트웨어 이벤트를 호스트로 전송합니다. 호스트 애플리케이션은 이벤트 처리기( Framegrabber API )를 통해 이를 수신하고, 애플릿 내의 상황에 대응할 수 있습니다. EventToHost 신호 입력의 상승 에지에서 이벤트를 발생시키며, 페이로드를 전달하지 않습니다. EventDataToHost 구성 가능한 데이터 페이로드를 함께 포함하는 이벤트를 발생시킵니다.
  • 등록 정보만: 일부 결과는 프레임 그래버에 읽을 수 있는 값으로 남아 있습니다. 다음과 같은 연산자들, 예를 들어 GetStatus 호스트 소프트웨어가 동적 매개변수로 읽어들이는 값을 저장합니다. 애플리케이션에서 상태 정보나 측정값만 필요한 경우에는 이미지 스트림이나 DMA 전송이 필요하지 않습니다.

한 설계에서는 이러한 출력 중 여러 가지를 결합할 수 있습니다. 예를 들어, 한 분기는 이미지를 통해 DmaToPC 반면 다른 분기는 다음과 같이 주장한다. GPO 특정 조건이 발생하면 호스트 이벤트를 트리거하거나 발생시킵니다.

연산자 관련 자세한 내용은 ‘연산자 참조’의 DmaToPC, GPO, EventToHost, EventDataToHost 및 GetStatus 항목을 참조하십시오.

버퍼가 없는 파이프라인 흐름#

대부분의 모듈은 내부적으로 전체 이미지를 저장하지 않습니다. 대신 출력 값을 계산한 뒤, 정보가 확보되는 즉시 이를 전달합니다.

모든 연산자가 데이터가 입력으로 들어오는 즉시 결과를 출력하는 것은 아닙니다. M-type 특히 연산자들은 출력 속도를 늦출 수 있습니다. 여기에는 다음과 같은 버퍼 연산자뿐만 아니라 LineBuffer 또는 ImageFifo — 많은 필터 및 동기화 연산자도 M형입니다. 지연 시간이 얼마나 되는지는 연산자에 따라 다릅니다. 자세한 내용은 Operator 유형 및 Synchronization 튜토리얼 주제와 Latency 튜토리얼 항목.

버퍼 연산자는 하류 모듈이 데이터를 수신할 수 있을 때까지 데이터를 저장합니다.

이러한 버퍼링되지 않은 동작 방식 덕분에 지연 시간이 짧아집니다. 한 픽셀이 출력 단계에 도달하는 동안에도 같은 프레임의 다른 픽셀들은 여전히 카메라 입력 단계에 있을 수 있습니다. 획득, 처리 및 DMA 작업이 시간적으로 중첩될 수 있습니다.

핵심 용어

생성된 FPGA 파이프라인을 분기점과 밸브가 있는 배관 시스템이라고 생각해 보세요. 공간이 생기자마자 물이 배관을 통해 흐릅니다. 버퍼 연산자는 배수량이 따라잡지 못할 때 채워지는 작은 저수지와 같습니다.

경로를 따라 지연 시간이 어떻게 누적되는지, 그리고 대역폭과 지연 시간의 차이점에 대해서는 ‘지연 시간 튜토리얼’ 항목을 참조하십시오.

하드웨어에서의 동시 처리#

프레임 그래버 FPGA에서는 모든 파이프라인 단계가 동시에 실행됩니다. 이는 명령어를 대체로 차례대로 실행하는 일반적인 CPU 프로그램과는 다릅니다.

한 FPGA 모듈이 한 픽셀을 처리하는 동안, 다른 모듈들은 처리 경로의 더 뒤쪽에서 다른 픽셀들을 처리합니다. 파이프라인이 가득 차면 여러 모듈이 동일한 이미지를 동시에 처리합니다. FPGA는 파이프라인 그래프의 구조와 일치하는 전용 하드웨어로 ‘ VisualApplets ’ 설계를 구현합니다.

핵심 용어

VisualApplets 설계에서 생성된 FPGA 하드웨어에서는 처리 경로가 프레임 그래버에 전용 하드웨어 로직으로 구현됩니다. 데이터는 컨베이어 위의 물품처럼 이러한 하드웨어 단계를 거쳐 이동합니다. 일반적으로 CPU는 데이터 덩어리 전체를 불러온 다음 단계별로 순차적으로 처리합니다.

빌드된 애플릿이 편집 가능한 *.vad 설계 파일과 어떤 관련이 있는지에 대한 자세한 내용은 VisualApplets 의 ‘기초 튜토리얼’ 항목을 참조하십시오.

처리량과 병목 현상#

처리량(Throughput )은 파이프라인을 통과하는 지속적인 데이터 전송 속도를 의미합니다. VisualApplets 설계에서는 이 값이 생성된 FPGA 하드웨어의 링크 대역폭과 밀접한 관련이 있습니다.

설계 내 연산자의 개수가 처리량을 저하시키지는 않습니다. 생성된 모든 FPGA 스테이지는 병렬로 실행될 수 있습니다. 병렬 분기 수 또한 처리량을 저하시키지 않습니다. 분기는 하드웨어 리소스를 추가하지만, 그 자체만으로는 개별 경로의 데이터 전송 속도를 늦추지 않습니다. 다음 두 설계에서 볼 수 있듯이, 두 개의 수집 경로는 서로 다른 수의 연산자를 사용하더라도 동일한 처리량을 제공할 수 있습니다:

동일한 처리량을 가진 두 가지 설계

처리량은 다음과 같은 요인에 따라 달라집니다:

  • 링크 용량: 모듈 간 연결을 통해 전송할 수 있는 데이터의 양입니다. 용량은 모듈 및 링크의 매개변수 설정, 특히 병렬 처리, 비트 폭, 최대 이미지 크기와 기본 설계 클럭에 의해 결정됩니다. 링크 및 모듈 속성에 대한 자세한 내용은 ‘매개변수 설정 자습서’ 항목을 참조하십시오.
  • 하류 준비 상태: 모듈이 데이터를 지속적으로 수신할 수 있는지 여부. 예를 들어 버퍼가 꽉 찼거나 후속 모듈이 차단되는 등의 이유로 모듈이 데이터를 지속적으로 수신할 수 없는 경우, 흐름 제어에 의해 스트림이 중단되어 차단 및/또는 역압이 발생합니다.
  • 통신사 제한 사항: 일부 통신사는 입력 링크가 제공하는 전체 대역폭을 처리하지 못할 수 있습니다. ‘통신사 참조 가이드’에는 해당 제한 사항이 영향을 받는 각 통신사별로 상세히 기술되어 있습니다.

픽셀 속도(초당 픽셀 수)로 표시되는 링크의 대역폭은 다음 공식을 따릅니다:

Bandwidth = parallelism × Base Design Clock

이 픽셀 속도 계산식에는 비트 폭이나 커널 크기가 포함되지 않습니다. 비트 폭이 넓거나 커널 크기가 클수록 클럭당 데이터 양 (비트 또는 값) 이 증가하며, 이는 DRAM 액세스 및 FPGA 리소스 측면에서 중요하지만, 이 픽셀 속도 수치 자체는 변하지 않습니다. DRAM 데이터 폭에 대해서는 ‘메모리 요소(Memory Elements )’ 튜토리얼 항목을 참조하십시오. 커널과 픽셀 속도 대역폭의 관계에 대해서는 ‘커널 작업(Working with Kernels )’ 튜토리얼 항목을 참조하십시오.

기본 설계 클럭은 프레임 그래버 플랫폼에 따라 다릅니다. ‘Device Resources’에서 해당 값을 확인하십시오.

최대 이미지 크기도 이 픽셀 속도 공식에는 나타나지 않지만, 여전히 설계에 영향을 미칩니다. 즉, 파이프라인이 처리할 수 있는 이미지 크기를 제한하기 때문입니다. 병렬 처리 및 비트 폭과 함께, 이러한 링크 속성은 사용자의 카메라 또는 라인 스캔 소스와 일치해야 합니다.

경로의 병목 현상은 해당 경로상에서 대역폭이 가장 낮은 지점을 말합니다. 설계의 전체 처리량은 항상 이 가장 좁은 지점에 의해 제한됩니다. 하나의 좁은 링크나 대역폭이 제한된 하나의 연산기만으로도 동일한 경로 상에서 그 상류에 위치한 모든 요소의 처리량이 제한됩니다. 따라서 처리량은 경로상에서 가장 좁은 대역폭과 하류 모듈이 데이터를 지속적으로 수신하는지 여부에 따라 결정됩니다.

설계 지침

병렬 처리 및 링크 속성은 카메라나 라인 스캔 소스에서 요구하는 전송 속도를 지원할 수 있는 최소 수준까지만 설정하십시오. 이러한 값을 더 높이면 FPGA 리소스가 추가로 소모될 뿐이며, 다른 구성 요소가 이미 병목 현상을 일으키고 있는 경우에는 처리량이 향상되지 않습니다.

일부 연산자는 입력과 출력 간의 병렬성을 변경합니다. 다른 연산자는 예를 들어 이미지를 자르는 방식으로 픽셀 수를 줄이기도 합니다. 그 결과, 필요한 출력 대역폭이 입력 대역폭과 다를 수 있습니다. 가능한 경우, 연산자는 병렬성을 자동으로 조정합니다. 조정이 불가능할 경우, ‘ VisualApplets ’에서 설계 규칙 검사 (Design Rules Check ) 오류를 보고합니다.

설계 시 필요한 대역폭을 계산하는 방법 및 운영자가 스트림을 병합할 때 발생하는 대역폭 병목 현상을 해결하는 방법에 대한 예시를 포함하여, 병렬 처리 계산 및 조정에 관한 자세한 내용은 Parallelism ‘튜토리얼’ 항목과 ‘병목 현상 해결 ’ 튜토리얼 항목을 참조하십시오.

설계 단계에서 처리량 시각화하기#

Link Info 및 Throughput 플래그를 사용하여 설계에서 Parallelism과 데이터 처리량을 시각적으로 확인할 수 있습니다. 툴바에서 다음 버튼을 사용하여 이러한 플래그를 활성화하십시오.

설계에서 Link Info 및 Throughput 플래그 활성화

결과적으로 설계에 Link Info 및 Throughput 플래그가 표시됩니다.

Link Info 및 Throughput 플래그

경로를 따라 값들을 비교하여 가장 좁은 연결 지점을 찾습니다. 하류 쪽의 연산자가 처리 속도를 따라가지 못하는 경우가 아니라면, 그 연결 지점이 해당 경로의 병목 지점이 됩니다.

정보

처리량 플래그만으로는 모든 성능 제한 사항을 확인할 수 없습니다. 예를 들어, 여러 DRAM 연산자가 동일한 메모리 인터페이스를 공유하는 경우, 공유 메모리로 인해 발생하는 DRAM 대역폭 제한은 처리량 표시창에 반영되지 않습니다. 그 밖의 DRAM 비효율성, 블로킹 및 잠재적인 교착 상태도 표시되지 않습니다. 공유 메모리 사용 및 DRAM 대역폭 계획에 대한 지침은 ‘메모리 요소 자습서’ 항목을 참조하십시오. 데드락에 대한 자세한 내용은 ‘연산자 유형 및 동기화’ 튜토리얼 항목을 참조하십시오.

처리량과 데이터 형식은 링크 속성과 모듈 속성에 따라 달라집니다. 앞서 다룬 용량 관련 속성(병렬 처리, 비트 폭, 최대 이미지 크기) 외에도, 이미지 프로토콜과 색상 형식 등이 대표적인 속성에 포함됩니다.

링크 속성은 파이프라인 전체에 걸쳐 전파됩니다. 카메라 출력 링크나 초기 처리 단계에서 여러 속성을 설정할 수 있으며, 이러한 속성은 운영자가 변경할 때까지 모든 하류 링크에 적용됩니다. 모듈 매개변수는 연결된 링크의 속성과 일치해야 합니다. 따라서 상류 링크에서 변경 사항이 발생하면, 다른 운영자가 해당 속성을 재설정할 때까지 그 뒤를 따르는 모든 운영자에 영향을 미칩니다.

링크 속성 및 전파 규칙의 전체 목록을 보려면 사용자 설명서의 ‘매개변수화 자습서’ 항목과 ‘링크 규칙’을 참조하십시오.

이미지 프로토콜은 링크상의 데이터 스트림 구조를 정의합니다. VisualApplets 는 다양한 데이터 유형 및 스트림 형식을 지원합니다:

의정서 일반적인 용도
VALT_IMAGE2D 예를 들어 면 스캔 카메라에서 촬영된, 줄 끝 마커와 프레임 끝 마커가 포함된 2차원 이미지. 한 프레임 내의 줄들은 길이가 서로 다를 수 있다.
VALT_LINE1D 라인 스캔 카메라 등에서 얻은 끝없는 또는 연속적인 라인 데이터.
VALT_PIXEL0D 이미지 크기 정보가 없는 비정형 연속 픽셀 스트림.
VALT_SIGNAL 트리거 로직 등에서와 같이, 모든 클럭 사이클마다 유효한 단일 비트 신호.

픽셀은 스캔 순서대로 파이프라인을 통과합니다. 즉, 한 줄 내에서 왼쪽에서 오른쪽으로, 그 다음 프레임 내에서 위에서 아래로 이동합니다. 일부 카메라 소스는 이와 다른 순서를 사용합니다. 소스가 이 규칙과 일치하지 않는 경우, 적절한 연산자를 사용하여 순서를 수정하십시오.

이미지 프로토콜 및 픽셀 순서에 대한 자세한 내용은 사용자 설명서의 “이미지 프로토콜, 이미지 크기 및 데이터 구조” 항목을 참조하십시오.

소스가 흐름 제어에 따라 일시 중지될 수 있는지 여부는 파이프라인을 어떻게 연결할지에 영향을 미칩니다. 카메라 연산자는 중지할 수 없는 소스입니다. 따라서 종종 그 바로 뒤에 버퍼 연산자를 배치합니다. 자세한 내용은 아래의 ‘흐름 제어, 차단 및 역압’과 ‘중지 가능한 데이터 스트림 및 중지 불가능한 데이터 스트림 튜토리얼’ 항목을 참조하십시오.

유량 제어, 차단 및 배압#

생성된 FPGA 파이프라인은 단계 간에 흐름 제어를 적용합니다. 특정 단계가 더 이상 데이터를 수신할 준비가 되지 않았을 경우, 해당 단계는 입력을 차단할 수 있습니다. 즉, 상류 단계에 대한 데이터 요청을 중단하면 상류 단계는 출력을 중단합니다. 이러한 차단은 역압(backpressure)의 형태로 파이프라인을 거슬러 뒤로 전파됩니다. 입력을 차단할 수 있는 것은 M형 연산자뿐이라는 점에 유의하십시오. VisualApplets 에 있는 그래픽 모듈은 이러한 하드웨어 동작을 설명할 뿐, 자체적으로 흐름 제어를 적용하지는 않습니다.

가정해 보자 DmaToPC 호스트 컴퓨터로 데이터를 충분히 빠르게 전송할 수 없습니다. 이로 인해 가끔씩 입력 신호가 차단됩니다. 이 차단 신호는 상류에 위치한 버퍼 운영자에게 전달됩니다. 차단 상태가 지속되는 동안 버퍼는 데이터 전달을 중단합니다. 버퍼는 들어오는 픽셀을 저장하며, 이로 인해 버퍼의 채움 수준이 상승합니다. 카메라가 데이터 전송을 중단하면 버퍼는 다시 비워집니다.

버퍼와 DMA를 활용한 간단한 데이터 읽기 경로

버퍼 연산자는 처리 속도가 서로 다른 단계를 분리합니다. 중지할 수 없는 카메라 소스 뒤에 버퍼가 없으면, 하류 모듈의 차단으로 인해 카메라 스트림의 속도가 느려지지 않습니다. 그 결과, 해당 설계는 설계 규칙 검사(DRC)를 통과하지 못하거나 하드웨어에서 교착 상태에 빠질 수 있습니다.

연산자 유형 및 O형, M형, P형 모듈에서 차단 동작이 어떻게 나타나는지에 대해서는 ‘연산자 유형 및 동기화 자습서’ 항목을 참조하십시오.

핵심 용어

블로킹이란 생성된 FPGA 스테이지가 더 이상 입력 데이터를 받아들일 수 없는 상태를 의미합니다. 예를 들어, 후속 스테이지가 데이터를 받아들이지 않거나 스테이지 내부의 처리 시간이 더 오래 걸리기 때문일 수 있습니다. VisualApplets 의 모듈 아이콘은 해당 스테이지를 나타내지만, 아이콘 자체는 대기하거나 차단되지 않습니다.
백프레셔(Backpressure)는 이러한 현상의 원리가 되는 메커니즘으로, “압력”이 역방향으로 작용합니다. 한 스테이지가 데이터를 충분히 빠르게 받아들이지 못하면 상류 스테이지들은 대기해야 하며, 데이터 흐름이 차단됩니다. 실제 사례: 다운스트림 스테이지가 데이터를 수신할 수 없는 경우(예: 버퍼가 가득 찬 경우), 업스트림 스테이지가 대기하게 됩니다.
이 주제의 대역폭은 연결의 픽셀 속도, 즉 초당 링크를 통과하는 픽셀 수를 의미합니다. 비트 폭과 커널 크기는 각 픽셀이 전달하는 데이터의 양을 변경하며, 이는 별개의 개념입니다. Parallelism 튜토리얼 주제를 참조하십시오.