콘텐츠로 바로 가기

Parallelism#

이 주제에서는 다음의 내용을 설명합니다. Parallelism VisualApplets 설계에서 ‘링크(link) 속성’이 무엇을 의미하는지, 그리고 해당 설정이 생성된 FPGA 파이프라인에 어떻게 반영되는지 설명합니다. 또한 설계에 필요한 병렬도를 계산하는 방법과 전용 연산자를 사용하여 병렬도를 조정하는 방법도 설명합니다. 이 주제를 읽은 후에는 병렬도, 대역폭, FPGA 리소스 사용량 간의 관계, 이미지 폭 제약 조건이 병렬도에 어떻게 좌우되는지, 그리고 다음과 같은 메모리 연산자가 FrameBufferRandomRead 병렬 처리의 한계를 설정합니다.

주요 용어

기본 설계 클럭 ( Base Design Clock) 은 프레임 그래버에서 생성된 FPGA 파이프라인의 클럭으로, 예를 들어 312.5 MHz입니다. 이는 카메라 픽셀 클럭과는 다르며, ‘ VisualApplets ’ 편집기 내부의 클럭도 아닙니다. 클럭 사이클은 기본 설계 클럭의 한 틱을 의미합니다. 클럭 사이클당 일정 수의 픽셀이 링크를 통과할 수 있습니다. 이 수를 병렬 처리량(parallelism)이라고 합니다. 병렬 처리량( Parallelism ) 4는 클럭 사이클당 4개의 픽셀을 의미합니다. 베이스 디자인 클럭 주파수가 높거나 병렬 처리 능력이 높을수록 픽셀 전송 속도가 증가하며, 이 주제에서는 이를 대역폭이라고 부릅니다.

Parallelism 및 대역폭#

Parallelism 생성된 FPGA 파이프라인의 링크를 통해 클럭 사이클당 흐르는 픽셀의 수입니다.

Parallelism 모듈 내부의 처리 세분성에 영향을 미칩니다. 예를 들어, LineBuffer 매개변수 XLength 병렬 처리 정도에 따라 달라집니다.

다음과 같은 규칙이 적용됩니다:

  • 병렬 처리도가 높을수록 → 픽셀 처리 대역폭이 높아집니다.
  • 병렬 처리 정도가 높을수록 → FPGA 자원 사용량이 증가합니다.

비트 폭과 커널 크기는 이 픽셀 속도 수치에 포함되지 않습니다. 이 두 요소는 클럭당 데이터 양을 증가시키며, 이는 DRAM 및 리소스 관리에 중요한 요소입니다. ‘커널 작업’ 튜토리얼 항목과 ‘메모리 요소’ 튜토리얼 항목을 참조하십시오.

디자인 가이드라인

FPGA 리소스를 절약하기 위해 병렬 처리 수준을 필요한 최소한으로 유지하십시오.

픽셀 속도로 표현된 링크의 대역폭은 다음 공식을 따릅니다:

대역폭 = 병렬 처리 수 × 기본 설계 클럭

기본 설계 클럭은 사용하는 프레임 그래버에 따라 달라집니다. Basler 프레임 그래버의 경우, ‘Device Resources’에서 해당 값을 확인하십시오.

주요 용어

'Link Info' 및 'Throughput' 플래그를 사용하면 설계에서 병렬 처리 및 데이터 처리량을 시각화할 수 있습니다. 툴바에 있는 다음 버튼을 사용하여 이 플래그들을 활성화하십시오:

설계에서 링크 정보 및 처리량 플래그 활성화

그 결과, 설계에 ‘링크 정보 ’ 및 ‘처리량 ’ 플래그가 표시됩니다:

링크 정보 및 처리량 플래그

이 주제에서는 ‘링크 정보 ’ 및 ‘처리량 ’ 플래그가 활성화된 상태의 디자인 스크린샷을 모두 보여드립니다.

필요량 계산 Parallelism#

설계에 치수를 지정하려면, 먼저 필요한 픽셀 속도를 계산한 다음, 기본 설계 클럭을 바탕으로 필요한 병렬 처리량을 도출해야 합니다.

영역 스캔 설계에 대한 Parallelism 계산#

에리어 스캔 카메라를 사용하는 설계의 경우, 먼저 초당 픽셀 단위의 대역폭을 계산합니다:

대역폭 = (줄당 픽셀 수) × (프레임당 줄 수) × 프레임 속도

그런 다음 대역폭을 활용하여 필요한 병렬 처리 수준을 계산합니다:

필요한 병렬 처리량 = 대역폭 / 기본 설계 클럭

계산된 요구 사항만큼은 되는, 지원되는 가장 작은 병렬도를 선택하십시오. 소수점 이하를 버림하면 설계 대역폭이 요구 사항을 충족하지 못하게 됩니다. 예를 들어, 기본 설계 클럭 312.5 MHz에서 6000 MP/s를 달성하려면 병렬도가 19.2여야 합니다. Parallelism 19를 선택하면 5937.5 MP/s밖에 나오지 않아 충분하지 않습니다. 20을 사용하거나, 플랫폼에서 허용하는 다음으로 높은 값을 사용하십시오.

영역 스캔 계산 예시#

해상도가 2064 × 2064 픽셀이고 초당 30 프레임을 지원하는 카메라의 경우, 다음과 같은 대역폭 계산이 적용됩니다:

대역폭 ≈ 2064 × 2064 × 30 ≈ 127.9 MP/s

기본 설계 클럭이 312.5 MHz이므로, 이에 따라 다음과 같은 병렬 처리 능력이 산출됩니다:

필요한 병렬도 ≈ 127.9 / 312.5 ≈ 0.41 → 1로 올림

영역 대역폭

위의 스크린샷은 이에 상응하는 ‘ VisualApplets ’ 설계 구현을 보여줍니다. 의 병렬 처리는 카메라 인터페이스 이 다음으로 설정된 경우 4. 이 값은 대역폭 계산에서 도출된 처리 병렬성과는 다릅니다. 그 CxpCamera 운영자는 에 의해 정의된 CXP 연결 수를 바탕으로 인터페이스 병렬 처리 방식을 자동으로 설정합니다. 연결 수 모듈 매개변수 (이 경우, x1). 인터페이스 병렬성과 필요한 처리 병렬성은 서로 다른 수치입니다. 필요한 처리 병렬성은 1, 링크 병렬 처리는 다음과 같이 줄어듭니다. 1 의 출력 링크에서 LineBuffer 연산자.

프레임 속도가 낮을 때, 병렬 처리 값은 1 이면 충분합니다. 프레임 속도나 해상도가 높아질수록 필요한 병렬 처리 수준도 증가합니다. 값을 계산한 후 지원되는 다음 단계로 올림하십시오. 예를 들어: 2, 4, 또는 8. 플랫폼에서 다음을 요구하는 경우 심지어 병렬 처리 시, 먼저 반올림한 다음, 그보다 한 단계 높은 유효한 짝수 값을 선택합니다. 예를 들어, 계산 결과 6.3, 사용 8, 그리고 아니라 7.

라인 스캔 설계에 대한 Parallelism 계산#

라인 스캔 카메라를 사용하는 설계의 경우, 먼저 초당 픽셀 단위의 대역폭을 계산합니다:

대역폭 = (줄당 픽셀 수) × 라인 속도

그런 다음 대역폭을 활용하여 필요한 병렬 처리 수준을 계산합니다:

필요한 병렬 처리량 = 대역폭 / 기본 설계 클럭

사용 중인 플랫폼의 규칙과 허용되는 병렬 처리 값에 따라 결과를 올림하십시오.

라인 스캔 계산 예시#

해상도가 16384 픽셀이고 라인 속도가 120 kHz인 카메라의 경우, 다음과 같은 대역폭 계산이 적용됩니다.

대역폭 ≈ 16384 × 120 kHz ≈ 1966.08 MP/s

기본 설계 클럭이 312.5 MHz이므로, 이에 따라 다음과 같은 병렬 처리 능력이 산출됩니다:

필요한 병렬도 ≈ 1966.08 / 312.5 ≈ 6.3 → 7로 올림

계산 결과 다음과 같습니다. 6.3, 따라서 다음 정수는 7. 플랫폼에서 다음을 요구하는 경우 심지어 병렬 처리 시, 그 다음으로 높은 유효한 짝수 값을 선택합니다 (8, 아니라 7). 아래 스크린샷에서는 병렬 처리를 사용하고 있습니다 7, 이는 병렬 처리가 필요하지 않은 경우에도 유효합니다.

라인 스캔 대역폭

위의 스크린샷은 이에 상응하는 ‘ VisualApplets ’ 설계 구현을 보여줍니다. 카메라 인터페이스에서의 병렬 처리 수준은 12. 이 값은 다음을 통해 자동으로 설정됩니다. CxpCamera CXP 연결 수에서 연산자 (연결 수 매개변수가 다음으로 설정됨 x2). 이러한 인터페이스 병렬성은 다시 말해, 요구되는 처리 병렬성과는 다르다. SplitImage 연산자는 1차원에서 2차원으로의 변환을 수행합니다. 이 LineBuffer 연산자는 링크 병렬성을 다음과 같이 줄입니다. 7 산출된 처리 요구 사항을 충족하기 위해.

설계에서 Parallelism 변경하기#

다음 연산자들은 설계의 병렬 처리 능력을 대역폭 요구 사항에 맞게 조정합니다:

~을 늘리거나 줄이는 것 Parallelism#

  • PARALLELdn — 병렬 처리를 저해합니다. 참조: PARALLELdn ‘운영자 참조’에서.
  • PARALLELup — 병렬 처리를 향상시킵니다. 참조: PARALLELup ‘운영자 참조’에서.
  • LineBuffer (imaFlex 전용): The ParallelismConverter operator의 LineBuffer 연산자는 별도의 병렬 처리 연산자 없이 입력과 출력 간의 병렬성을 조정합니다. 참조: LineBuffer (imaFlex) ‘운영자 참조’에서.

스트림 분할, 선택 및 병합#

  • SplitParallel — 병렬도가 더 높은 하나의 데이터 스트림을 병렬도가 더 낮은 여러 스트림으로 분할합니다. 예: Parallelism 8 병렬 처리를 통해 두 개의 스트림으로 나뉩니다 4 각각. 또한 다음을 참조하십시오. SplitParallel ‘운영자 참조’에서.
  • SelectFromParallel — 병렬 스트림에서 개별 구성 요소를 선택합니다. 예를 들어, 클럭 사이클당 전송되는 여러 데이터 워드 중 하나를 선택하는 경우입니다. 다음 항목도 참조하십시오. SelectFromParallel ‘운영자 참조’에서.
  • MergeParallel — 개별 처리를 마친 후 병렬 스트림을 다시 병합합니다. 다음 항목도 참조하십시오. MergeParallel ‘운영자 참조’에서.

기타 사업자#

  • CastParallel — 링크상의 비트를 재해석합니다. 다음 조건이 충족되는 한, Parallelism 및 비트 폭은 변경될 수 있습니다. 비트 폭 × 병렬 처리 정도 입력과 출력에서 동일하게 유지됩니다. 예: 16비트 × PAR 2는 8비트 × PAR 4가 됩니다. 이미지 너비는 이에 따라 변경됩니다. 참조: CastParallel ‘운영자 참조’에서.
  • ExpandToParallel — 병렬도 1의 입력을 받아 원하는 병렬도의 출력을 생성합니다. 입력 값은 모든 병렬 채널에 복제됩니다. 다음 항목도 참조하십시오. ExpandToParallel ‘운영자 참조’에서.

사용 사례#

다음과 같은 사용 사례가 자주 나타납니다:

  • 설정하려는 속성을 식별하려면 PARALLELup 병렬 처리를 높이고, 데이터를 병렬 분기로 처리한 다음, 다시 분기를 병합하여 MergeParallel. ParUpMergeParallel

  • 특정 처리 작업의 경우, 구성 요소를 단 하나만 선택해도 수학적으로 충분하며, 데이터 양을 줄이면서도 필요한 결과를 얻을 수 있습니다. 사용법 SelectFromParallel 병렬 처리에서 하나의 채널만 전달하기 위해 4 스트림.

SelectFromParallel

  • ~ 이후 FrameBufferRandomRead, 스트림은 병렬로 실행됩니다 1 예를 들어, 픽셀당 64비트인 경우입니다. 후속 처리가 더 높은 병렬도로 실행되도록 하려면, 데이터 스트림을 8비트 × 병렬도 형태로 재해석하십시오. 8. 이를 위해서는 다음을 사용하십시오. CastParallel 연산자.

Parallelism 프레임 버퍼 랜덤 읽기

  • 설정하려는 속성을 식별하려면 ExpandToParallel 병렬 처리를 통해 제어 값 또는 픽셀 스트림을 확장하려면 1 병렬 처리에 4 예를 들어, 병렬 분기 내의 계수나 마스크와 같이, 네 개의 병렬 채널 모두에서 동일한 값을 사용할 수 있어야 할 때.

ExpandToParallel

Parallelism 제약 조건#

이미지의 최대 너비 (픽셀 단위)는 병렬 처리 수로 나누어 떨어져야 합니다.

예시:

  • 병렬 처리를 통해 4, 허용되는 이미지 너비에는 1024와 2048이 포함됩니다.
  • 병렬 처리를 통해 12, 이미지 너비가 16384인 경우 않습니다 16384 ÷ 12의 결과가 정수가 아니므로 허용되지 않습니다.

대안:

  1. 더미 픽셀 — 시뮬레이션 링크 속성이나 연산자 등을 통해 이미지 너비가 병렬 처리 값으로 정확히 나누어지도록 이미지를 넓힙니다.
  2. 자르기 — 이미지를 유효한 너비로 자릅니다.

주요 용어

생성된 FPGA 하드웨어는 클럭당 패킷 단위로 픽셀을 처리합니다. 16384픽셀로 구성된 한 줄은 16384 / 12가 정수가 아니기 때문에 병렬 처리 단위 12에 정확히 들어맞지 않습니다. 따라서 VisualApplets 에서는 설계 내의 이미지 너비가 병렬 처리 단위로 나누어 떨어져야 한다고 규정하고 있습니다.

Parallelism 메모리 연산자와 함께#

FrameBufferRandomRead 다음만 허용합니다 병렬성 1, 메모리는 순차적으로 액세스되기 때문입니다. 설계에서 더 높은 병렬도를 활용하면서도 전체 대역폭에 영향을 미치지 않으려면, 다음을 사용하여 병렬 구성 요소를 커널 구성 요소로 변환하십시오. CastKernel 연산자 또는 다음을 사용하여 현재 픽셀의 상위 비트 구성 요소에 CastParallel 연산자.

이를 수행하는 방법에 대한 예시는 ‘커널 작업’ 튜토리얼 항목을 참조하십시오.

‘연산자 참조’의 ‘FrameBufferRandomRead’ 항목과 ‘연산자 참조’의 ‘FrameBufferRandomRead (imaFlex) ’ 항목을 참조하십시오.

병목 현상 해결#

일반적인 병목 현상은 다음과 같은 경우에 발생합니다. InsertLine ‘연산자 참조’에서 또는 InsertImage ‘연산자 참조’에 있는 내용은 다음과 결합되지 않습니다. PARALLELup. 연산자 순서가 불리할 경우, 처리량이 감소할 수 있습니다.

삽입 연산자를 사용하면 처리 파이프라인으로 유입되는 데이터 양이 증가하여 전체 대역폭이 높아집니다. 따라서, 이후의 병렬 처리는 InsertLine 또는 InsertImage 연산자는 결과적으로 발생하는 대역폭을 처리할 수 있을 만큼 충분히 높아야 합니다.

예시#

이미지 삽입

위 이미지의 예시는 다음과 같이 보여줍니다. InsertImage 이 연산자에는 두 개의 입력 링크가 있습니다. 각 입력 링크는 4의 병렬도를 사용하여 1250 MPixel/s의 대역폭으로 5120 × 5120 픽셀 해상도의 이미지를 처리합니다.

만약 그 전에 병렬 처리 수준이 높아지지 않는다면 InsertImage 연산기를 사용하더라도 입력당 대역폭은 1250 MPixel/s로 유지됩니다. 하지만 입력 링크가 두 개이므로, 이 설계는 총 2 × 1250 MPixel/s의 처리량을 처리해야 합니다.

이러한 대역폭 병목 현상을 방지하려면 다음을 사용하여 병렬 처리를 늘리십시오. PARALLELup 앞의 연산자 InsertImage 아래와 같이 연산자를 사용합니다:

이미지 삽입 (위쪽)