FPGA 펌웨어 디자인 : 너무 큰가?


13

matlab에서 VHDL로 포팅 해야하는 특히 큰 신호 처리 변환이 있습니다. 확실히 어떤 종류의 리소스 공유가 필요합니다. 약간의 계산으로 다음을 얻었습니다.

  • 64 포인트 512 fft
  • 41210 곱하기 추가 연산

가장 큰 Virtex 6 FPGA에는 ~ 2000 DSP48E 블록이 있다고 생각하면 리소스를 여러 번 재사용하기 위해 리소스를 공유 할 수 있다는 것을 알고 있습니다. 실행 시간은 실제로 문제가되지 않으며 처리 시간은 FPGA 용어로 비교적 오래 걸릴 수 있습니다.

리소스 사용량을 살펴보면 radix-2 lite 아키텍처를 사용하면 4dsp 블록 / FFT 작업 = 2048 DSP 블록, 총 ~ 43k가 나옵니다. 가장 큰 Virtex FPGA에는 2k 블록 또는 20 개의 작업 / mux가 있습니다.

분명히 직물에 그러한 큰 mux를 포함시키는 것은 조각을 취할 것입니다. 이 한도의 상단을 어디에서 찾을 수 있습니까? FPGA 리소스를 무한정 공유 할 수 없습니다. 41210 배율이 너무 큽니까? 너무 큰 것을 어떻게 계산합니까?

또한 다른 리소스 (슬라이스, 브람스 등)도 살펴 보았습니다. Radix-2 Lite는 또한 4 x 18k 브램 / fft = 2048 브램을 제공합니다. 가장 큰 Xilinx FPGA에는 2128 브램이 포함되어 있습니다. 매우 경계선입니다. 내 디자인이 너무 크다는 것이 걱정입니다.


최신 정보:

디자인 자체에 대한 추가 정보. 자세히 설명 할 수는 없지만 다음과 같이 할 수 있습니다.

Initial conditions -> 512 ffts -> 40k multipliers ---------|----> output data to host 

                 ^------re-calculate initial conditions----|

출력 데이터 속도 사양 : "matlab 시뮬레이션보다 빠름"

현명한 계산, 여기 내가 있습니다 :

FFT 단계 : 쉬움. 1/2/4/8 FFT를 구현하고 결과를 SDRAM에 저장 한 후 나중에 액세스 할 수 있습니다. 시간이 오래 걸리더라도 비교적 작습니다. radix-2 lite를 사용하면 2 개의 DSP48E와 2 개의 18k BRAMS / FFT를 얻을 수 있습니다. 스트리밍은 6 개의 DSP48E에 0BRAMS / FFT를 제공합니다. 두 경우 모두 64 포인트 FFT는 FPGA 리소스 용어가 작습니다.

승수 : 이것은 내 문제입니다. 곱셈 입력은 룩업 테이블 또는 FFT 데이터에서 가져옵니다. 그것은 실제로 단지 여러 번의 곱셈입니다. 최적화 할 것이 많지 않습니다. 필터는 아니지만 필터와 유사한 특성을 가지고 있습니다.

FPGA에서 리소스 공유를 고려하면 수학은 다음과 같이 작동합니다. 하나의 LUT-6을 4-way mux로 사용할 수 있습니다. N-way, M 비트 mux의 공식은 다음과 같습니다.

N*M/3 = number of luts, or N*M/12 = slices (4 LUTS/slice).

내 구현의 숫자를 크 런칭해도 좋은 결과를 얻지 못합니다. virtix-6 제품군의 90 %에는 40k 작업을 수행하기 위해 DSP를 리소스 공유하기에 충분한 슬라이스가 없습니다.


가장 효율적인 형태의 리소스 공유는 메모리를 처리하여 데이터에 액세스 할 수있는 부분 직렬화입니다. 물론, 이것의 극단적 인 경우에는 기존의 저장 프로그램 프로세서로 돌아갑니다. 하드 성능 요구 사항의 부족은 컴퓨팅 클라우드에서 실행되는 소프트웨어 구현의 유연성으로 다시 시작됩니다.
Chris Stratton

1
이것은 질문의 일부는 아니지만 리소스 계산에서 피연산자 크기를 명시하지 않았습니다. 512 FFT x 64 포인트 x 몇 비트? FPGA에서 피연산자 크기는 전적으로 사용자에게 달려 있으므로 문제의 크기를 해결할 때 고려해야합니다.
광자

당신이 깨달았는지 모르겠지만, 그 큰 FPGA는 상당히 비쌉니다. 일부는 $ 5k 이상일 수 있습니다. 아마도 비용이 문제가되지 않는 한, 그 점을 고려해야합니다.
Gustavo Litovsky

1
불행히도 지금까지 답변에서 얻은 대체 솔루션 제안을 넘어서서 우리가 더 많은 것을 할 수 있는지 의심 스럽습니다. 즉, 하나의 FFT 코어를 만들고 512 입력을 차례로 통과 할 수 있으며 상당히 작은 FPGA에도 적합합니다. 그 사이와 병렬로 모든 작업을 수행하는 것은 응용 프로그램의 속도와 리소스의 균형이 적절하지만 누구에게나 어려운 것은 아닙니다.
광자

1
이에 대한 예산 번호가 있습니까? 구스타보 (Gustavo)가 지적했듯이, 하이 엔드 FPGA는 가격이 비싸고이를위한 PCB를 개발하고있다. 컴퓨팅 하드웨어의 양을 두 배로 늘리거나 (또는 ​​네 배로 늘리거나 ...) 기존의 입증 된 (?)을 계속 사용하는 반면 Matlab 코드는 주어진 속도 사양을 충족 할 수 있습니다.
광자

답변:


8

문제를 보는 다른 방법이 있는지 궁금합니다.

512 FFT 연산 (각각 64 포인트)과 42k MAC 연산의 추정치 재생 ... 알고리즘을 한 번 통과하는 데 필요한 것으로 가정합니다.

이제 4 개의 DSP 장치를 사용하는 FFT 코어를 찾았지만 FFT 당 몇 개의 클록 사이클이 필요합니까? (대기 시간이 아닌 처리량)? 포인트 당 64 또는 1 사이클을 가정 해 봅시다. 그런 다음 각각의 MAC이 42 개의 작업을 처리하면서 64 개의 사이클 (1 사이클 당 1k MAC)로 42k Mac 작업을 완료해야합니다.

이제 나머지 알고리즘을 더 자세히 살펴볼 차례입니다. 재사용 할 수있는 MAC이 아니라 상위 수준 작업 (필터링, 상관 관계 등)을 식별합니다. 재사용 성 (예 : 선택 가능한 계수 세트가있는 필터)으로 이러한 각 작업에 대한 코어를 구축하면 곧 비교적 큰 코어 사이에 필요한 멀티플렉서가 거의 없을 것입니다 ...

또한 강도 감소가 가능합니까? 2 차 (및 그 이상)를 생성하기 위해 루프의 곱셈이 필요한 경우가있었습니다. 그것들을 풀면 곱셈없이 반복적으로 생성 할 수 있습니다 : FPGA에서 Difference Engine을 빌드 한 날에 매우 기뻤습니다!

응용 프로그램을 알지 못하면 더 자세한 내용을 알 수는 없지만 일부 분석은 주요 단순화를 가능하게합니다.

당신이 마음에 명확한 플랫폼이없는 경우로 소리 때문에 - - 또한 당신이 ... 여러 FPGA에 걸쳐 분할 한 번 봐 걸릴 수 있는지 생각 이 보드 또는 이와 편리한 플랫폼에서 다수의 FPGA를 제공합니다. 그들은 또한 100 개의 스파르탄 -3 장치가있는 보드를 가지고 있습니다 ...

(ps는 소프트웨어 담당자 가이 다른 질문을 닫았을 때 실망했습니다. 적어도 적절하다고 생각합니다)

편집 : 편집을 다시하십시오-당신이 거기에 도착하기 시작한 것 같습니다. 모든 승수 입력이 FFT 출력이거나 "필터링되지 않은"계수 인 경우 악용해야 할 규칙이 보이기 시작합니다. 각 승수에 대한 하나의 입력은 FFT 출력에 연결되고 다른 하나는 계수 ROM에 연결됩니다 (BlockRam은 상수 배열로 구현 됨).

동일한 FFT 장치를 통해 다른 FFT 작업을 시퀀싱하면이 승수를 지나서 FFT 출력이 자동으로 시퀀싱됩니다. 정확한 계수를 다른 MPY 입력으로 시퀀싱하는 것은 이제 올바른 시간에 올바른 ROM 주소를 구성하는 문제 일뿐입니다. 즉, MUX의 큰 골칫거리가 아니라 조직 문제입니다.

성능 : Dave Tweed는 불필요하게 비관적이라고 생각합니다 .FFT는 n * log (n) 연산을 수행하지만 O (n) 버터 플라이 단위 및 O (logN)주기 또는 O (logN) 단위 및 O ( n) 자원 또는 속도 목표에 맞는주기 또는 다른 조합. 그러한 조합 중 하나는 post-FFT 곱하기 구조를 다른 것보다 훨씬 간단하게 만들 수 있습니다 ...


단일 하드웨어 버터 플라이로 구현 된 FFT는 NlogN 클럭 사이클을 완료해야합니다. 512 포인트의 경우 256 * 8 나비 또는 2048 클럭입니다. 즉, 41210 (또는 32768?) MAC은 같은 시간에 8-10 개의 하드웨어 멀티 플라이어 만 있으면됩니다.
Dave Tweed

16-20 곱하기를 의미합니다.
Dave Tweed

미안, 방금 거꾸로 알았어 개별 FFT는 64 포인트이므로 단일 버터 플라이 구현에는 32 * 5 = 160 클럭이 필요합니다. MAC은 200-250 개의 하드웨어 멀티 플라이어로 수행 할 수 있습니다.
Dave Tweed

이것이 저를 뒤죽박죽입니다. xilinx는 400k 곱하기 추가 연산 (NlogN)이 필요한 16k / 32k fft를 수행 할 수있는 코어를 어떻게 디자인 할 수 있습니까?하지만 41k로 어려움을 겪고 있습니까? 방법이 있어야합니다!
stanri

@Dave : 160 사이클이 아니라 160 곱셈을 의미한다고 생각합니까? FFT에는 본질적으로 직렬화 된 것이 전혀 없습니다 ...
Brian Drummond

2

이 문제에 실시간 제약 조건이없고 그렇지 않은 것처럼 들립니다. "빠르게"실행하기를 원한다면 하나 이상의 GPU에서 가속하는 것이 가능할 것 같습니다. 비교적 간단한 제안을하는 여러 소프트웨어 라이브러리가 있으며, 이는 맞춤형 FPGA 하드웨어를 사용하는 것보다 훨씬 쉽습니다.

"GPU 지원 라이브러리"또는 "GPU 가속 라이브러리"에 대한 Google 만 시작하십시오.


흥미롭게도, 나는이 프로젝트에 대해 들었을 때 클라이언트에게 GPU를 언급했지만 그는 관심이 없었습니다.
stanri

@StaceyAnneRieck : 그는 왜 말을 했습니까?
Dave Tweed

그는 왜 FPGA를 사용하기 전에 그다지 효과가없는 것처럼 보이기 전에 그 이유를 조사한 이유를 밝히지 않았습니다. 다시 가져와야합니다.
stanri

@stanri : 궁극적으로 FPGA 구현을하더라도 GPU가 전체 시스템 아키텍처를 "빵판"으로 만드는 좋은 방법 인 것 같습니다. 알고리즘에 대한 일종의 높은 수준의 데이터 흐름 그래프가 있습니까 (그리고 공유 할 수 있습니까?), 관련된 데이터의 양에 대한 아이디어를 주실 수 있습니까? 이와 같은 질문에 대한 답이 없으면 매우 일반적인 조언 이외의 것을 제공하는 것이 실제로 어려울 것입니다.
Dave Tweed

실제로는 매우 간단한 알고리즘이며 매우 복잡한 규모 일뿐입니다. 기본적으로 다음과 같습니다 : 초기 조건-> 512 ffts 병렬-> 32768 FFT 출력에서 ​​곱하기 연산-> 초기 조건 조정-> 헹굼 및 반복
stanri

1

특정 종류의 수학 연산을 크게 가속화하기 위해 특수 하드웨어 또는 FPGA (또는 CPLD)를 사용할 수 있습니다. 수학 연산을 가속화하기 위해 하드웨어 (회로 또는 FPGA 로직)를 설계하려고 할 때 염두에 두어야 할 핵심 사항은 디바이스로 들어오고 나가는 순서 데이터를 파악하는 것입니다. 효율적인 I / O 레이아웃을 가진 장치는 후자가 더 많은 회로를 요구하더라도 비효율적 인 레이아웃을 가진 장치보다 훨씬 우수한 성능을 제공 할 수 있습니다.

FFT를위한 하드웨어 지원 설계를 시도하지는 않았지만, 내가 본 것은 RSA 암호화에 사용될 수있는 대규모 곱셈 연산에 대한 하드웨어 지원입니다. 특수 고속 곱셈 하드웨어가있는 많은 마이크로 컨트롤러는 많은 레지스터 셔플 링이 필요하기 때문에 이러한 연산에서별로 효율적이지 않습니다. 레지스터 스와핑을 최소화하도록 설계된 하드웨어는 하드웨어 자체가 정교하지 않더라도 다중 정밀도 곱셈 연산으로 훨씬 더 나은 성능을 달성 할 수 있습니다. 예를 들어, 한 번에 2 비트 씩 파이프 라인 된 16xN 곱셈을 수행 할 수있는 하드웨어 (2 개의 하위 비트 다중 배수에서 시프트하고 2 개의 상위 비트 비트를 시프트)는 한 사이클에서 8x8 배수를 수행 할 수있는 하드웨어보다 더 나은 성능을 달성 할 수 있습니다. 전자는 더 적은 회로를 사용할 수 있지만 (파이프 라인으로 인해 중요한 데이터 경로가 더 짧습니다). 핵심은 필요한 코드의 "내부 루프"가 어떻게 보이는지 파악하고 쉽게 제거 할 수있는 비 효율성이 있는지 알아내는 것입니다.


어떤 형태의 작업이이 최적화 형태에 특히 적합합니까? 곱하기 연산의 특성에 대해 좀 더 자세히 설명하기 위해 위의 질문을 편집했습니다. 하드웨어 어시스트 디자인은 정말 흥미로운 소리!
stanri

0

실행 시간이 얼마나 문제가되지 않습니까?

이는 실제로 소프트 MCU, 통합 MCU가 내장 된 FPGA 또는 별도의 MCU 장치를 구현하고 모든 작업을 직렬화해야하는 상황처럼 보입니다.

실행 시간이 있다고 가정하면 소프트웨어에서 FFT를 수행하는 것이 디버그하기가 훨씬 쉽고 설계가 훨씬 간단합니다.


1
FPGA의 소프트 코어 CPU에서 많은 계산을하는 것은 어리석은 일입니다. 저장된 프로그램 아키텍처 (고려해야 할 것)에서 계산을 수행하려는 경우, 비교 가능한 팹보다 유연한 로직의 속도 페널티를 지불하지 않는 고성능 / 달러 하드 CPU에서 계산해야합니다. 생성 하드 로직.
Chris Stratton

@ChrisStratton-좋은 지적입니다. 그 효과에 대한 메모를 추가했습니다.
코너 울프

1
내장 된 하드 CPU조차도 소프트웨어 기반 작업을 위해 기존의 프로세서 / GPU를 상용화 할 계획이 없으며 비용이 크게 증가합니다.
Chris Stratton

@ChrisStratton-가장 일반적인 통합 하드 CPU 아키텍처는 ARM 또는 POWER라고 생각 했습니까? 이 경우, 그것은 기본적 입니다 상품 CPU.
코너 울프

1
다른 FPGA 질문을 감안할 때 FPGA 보드를 구축하는 것은 예상보다 비용이 많이 드는 학습 경험이 될 것입니다. 이 시점에서해야 할 일은 클라이언트에게 시범 컴퓨팅 클라우드 실행 (하드웨어를 구매할 수 있음)의 가격 / 성능 수치를 높이는 것과 FPGA의 높은 가격 및 훨씬 높은 위험에 대한 아이디어를 제공하는 것이라고 생각합니다. .
Chris Stratton
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.