Thiết kế phần sụn: Làm thế nào lớn là quá lớn?


12

Tôi có một biến đổi xử lý tín hiệu đặc biệt lớn cần được chuyển từ MATLAB sang VHDL. Nó chắc chắn đòi hỏi một số loại chia sẻ tài nguyên. Một chút tính toán đã cho tôi như sau:

  • 512 điểm của 64 điểm
  • 41210 phép toán cộng

Xem xét Virtex 6 FPGA lớn nhất có ~ 2000 khối DSP48E, tôi biết rằng tôi có thể chia sẻ tài nguyên để sử dụng lại tài nguyên nhiều lần. Thời gian thực hiện không thực sự là một vấn đề, thời gian xử lý có thể mất tương đối lâu trong các thuật ngữ FPGA.

Nhìn vào việc sử dụng tài nguyên, sử dụng kiến ​​trúc lite radix-2 cho tôi các khối 4dsp / hoạt động FFT = 2048 khối DSP, tổng cộng ~ 43k. Virtex lớn nhất có 2k khối, hoặc 20 thao tác / mux.

Rõ ràng bao gồm cả các mux lớn như vậy vào vải cũng sẽ mất các lát. Tôi tìm thấy phần cuối của giới hạn này ở đâu? Tôi không thể chia sẻ vô hạn các tài nguyên FPGA. Là số nhân 41210 quá lớn? Làm thế nào để tôi tính toán những gì là quá lớn?

Tôi cũng đã xem xét các tài nguyên khác (Lát, Brams, v.v.). Radix-2 Lite cũng cho 4 x 18 kam / fft = 2048 bram Xilinx lớn nhất chứa 2128 Brams. rất biên giới. Tôi lo ngại rằng thiết kế của tôi quá lớn.


CẬP NHẬT:

Một số thông tin thêm về bản thân thiết kế. Tôi không thể đi vào chi tiết, nhưng đây là những gì tôi có thể cung cấp:

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

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

specarate specarate: "nhanh hơn mô phỏng MATLAB"

Tính toán khôn ngoan, đây là nơi tôi đang ở:

Giai đoạn FFT: dễ dàng. Tôi có thể triển khai 1/2/4/8 FFT, lưu trữ kết quả trong SDRAM và truy cập sau. Tương đối nhỏ, ngay cả khi mất nhiều thời gian, nó vẫn ổn. sử dụng radix-2 lite tôi có thể nhận được 2 DSP48E và 2 BRAM / FFT 18k. phát trực tuyến cho 6 DSP48E 0BRAM / FFT. trong cả hai trường hợp, FFT 64 điểm là nhỏ về thuật ngữ tài nguyên.

Số nhân : đây là vấn đề của tôi. Các đầu vào nhân được lấy từ bảng tra cứu hoặc dữ liệu FFT. Nó thực sự chỉ là một loạt các phép cộng. Không có nhiều thứ để tối ưu hóa. Không phải là bộ lọc, nhưng có các đặc điểm tương tự như bộ lọc.

Xem xét việc chia sẻ tài nguyên trên FPGA, toán học hoạt động như sau: Một LUT-6 có thể được sử dụng như một mux 4 chiều. Công thức cho mux N-way, M bit như sau:

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

crunching số để thực hiện của tôi không cho kết quả tốt. 90% gia đình virtix-6 không có đủ lát để chia sẻ tài nguyên DSP của họ để thực hiện các hoạt động 40k.


Các hình thức chia sẻ tài nguyên hiệu quả nhất là tuần tự hóa một phần nơi bạn có thể truy cập dữ liệu bằng cách đánh địa chỉ bộ nhớ. Tất nhiên, ở mức cực đoan này, bạn quay lại bộ xử lý chương trình lưu trữ thông thường - việc thiếu các yêu cầu hiệu năng cứng bắt đầu quay trở lại tính linh hoạt của việc triển khai phần mềm có thể chạy trong đám mây tính toán.
Chris Stratton

1
Đây không phải là một phần của câu hỏi của bạn, nhưng trong tính toán tài nguyên của bạn, bạn không nêu rõ toán hạng kích thước. 512 FFT x 64 điểm x có bao nhiêu bit? Trong một đồ họa, kích thước toán hạng hoàn toàn phụ thuộc vào bạn, vì vậy bạn phải xem xét nó khi xử lý kích thước của vấn đề.
Photon

Tôi không biết nếu bạn nhận ra, nhưng những đồ họa lớn đó khá đắt. Một số có thể trên $ 5k. Có lẽ bạn cũng nên cân nhắc điều đó, trừ khi chi phí không phải là vấn đề.
Gustavo Litovsky

1
Thật không may, ngoài các gợi ý giải pháp thay thế mà bạn có trong các câu trả lời cho đến nay, tôi nghi ngờ liệu chúng tôi có thể làm nhiều hơn cho bạn không. Ý tôi là, bạn có thể tạo ra một lõi FFT và chạy 512 đầu vào của mình qua từng đầu vào, và rõ ràng điều đó sẽ phù hợp với ngay cả một GPU khá nhỏ. Ở đâu đó giữa việc đó và làm mọi thứ song song là sự cân bằng giữa tốc độ và tài nguyên cho ứng dụng của bạn ... nhưng thật khó cho bất cứ ai ngoài bạn nói rằng sự cân bằng đó nên ở đâu.
Photon

1
Bạn có một số ngân sách cho việc này? Giống như Gustavo đã chỉ ra, các GPU cao cấp rất đắt tiền, vì đang phát triển PCB để đặt chúng lên. Trong khi chỉ cần nhân đôi (hoặc tăng gấp bốn lần hoặc ...) số lượng phần cứng tính toán và tiếp tục sử dụng mã Matlab đã được chứng minh (?), Có thể có thể đáp ứng thông số tốc độ như đã đưa ra.
Photon

Câu trả lời:


8

Tôi tự hỏi nếu có một cách khác để xem xét vấn đề?

Thực hiện ước tính của bạn về 512 thao tác FFT (mỗi hoạt động 64 điểm) và 42 nghìn thao tác MAC ... Tôi đoán đây là những gì bạn cần cho một lần vượt qua thuật toán?

Bây giờ bạn đã tìm thấy lõi FFT sử dụng 4 đơn vị DSP ... nhưng phải mất bao nhiêu chu kỳ xung nhịp cho mỗi FFT? (thông lượng, không phải độ trễ)? Giả sử 64 hoặc 1 chu kỳ cho mỗi điểm. Sau đó, bạn phải hoàn thành 42k thao tác Mac đó trong 64 chu kỳ - có thể là 1k MAC mỗi chu kỳ, với mỗi MAC xử lý 42 thao tác.

Bây giờ là lúc để xem xét phần còn lại của thuật toán chi tiết hơn: xác định không phải MAC mà là các hoạt động cấp cao hơn (lọc, tương quan, bất cứ điều gì) có thể được sử dụng lại. Xây dựng các lõi cho từng thao tác này, với khả năng sử dụng lại (ví dụ: các bộ lọc với các bộ hệ số có thể lựa chọn khác nhau) và chẳng mấy chốc bạn có thể tìm thấy tương đối ít bộ ghép kênh được yêu cầu giữa các lõi tương đối lớn ...

Ngoài ra, có bất kỳ giảm sức mạnh có thể? Tôi đã có một số trường hợp nhân các vòng lặp được yêu cầu để tạo ra tứ giác (và cao hơn). Không kiểm soát chúng, tôi có thể lặp đi lặp lại chúng mà không cần nhân: Tôi khá hài lòng với chính mình vào ngày tôi chế tạo Công cụ khác biệt trên đồ họa!

Không biết ứng dụng tôi không thể cung cấp thêm chi tiết nhưng một số phân tích như vậy có khả năng thực hiện một số đơn giản hóa lớn.

Ngoài ra - vì nghe có vẻ như bạn không có một nền tảng xác định trong tâm trí - hãy xem xét liệu bạn có thể phân vùng trên nhiều FPGA không ... hãy xem bảng này hoặc cái này cung cấp nhiều FPGA trong một nền tảng thuận tiện. Họ cũng có một bảng với 100 thiết bị Spartan-3 ...

(ps Tôi đã thất vọng khi những người phần mềm đóng câu hỏi khác này - tôi nghĩ ít nhất là nó phù hợp ở đó)

Chỉnh sửa: lại chỉnh sửa của bạn - Tôi nghĩ rằng bạn đang bắt đầu đến đó. Nếu tất cả các đầu vào số nhân là đầu ra FFT hoặc hệ số "không lọc", bạn sẽ bắt đầu thấy loại thường xuyên bạn cần khai thác. Một đầu vào cho mỗi số nhân kết nối với đầu ra FFT, đầu vào khác cho ROM hệ số (BlockRam được triển khai dưới dạng một mảng không đổi).

Sắp xếp các hoạt động FFT khác nhau thông qua cùng một đơn vị FFT sẽ tự động sắp xếp các đầu ra FFT qua hệ số nhân này. Sắp xếp các hệ số chính xác vào đầu vào MPY khác hiện chỉ là "vấn đề" tổ chức các địa chỉ ROM chính xác vào đúng thời điểm: một vấn đề tổ chức, thay vì đau đầu rất lớn của MUXes.

Về hiệu suất: Tôi nghĩ Dave Tweed tỏ ra bi quan không cần thiết - FFT thực hiện các thao tác n * log (n), nhưng bạn có thể chọn các đơn vị bướm O (n) và chu kỳ O (logN) hoặc O (logN) và O (logN) n) chu kỳ hoặc một số kết hợp khác để phù hợp với mục tiêu tài nguyên và tốc độ của bạn. Một kết hợp như vậy có thể làm cho cấu trúc nhân sau FFT đơn giản hơn nhiều so với các cấu trúc khác ...


Một FFT được triển khai với một con bướm phần cứng duy nhất sẽ yêu cầu chu kỳ đồng hồ NlogN để hoàn thành; cho 512 điểm, đó sẽ là 256 * 8 con bướm, hoặc 2048 đồng hồ. Điều đó có nghĩa là các MAC 41210 (hoặc 32768?) Sẽ chỉ cần 8-10 số nhân phần cứng để hoàn thành trong cùng một khoảng thời gian.
Dave Tweed

Ý tôi là, số nhân 16-20.
Dave Tweed

Xin lỗi, tôi chỉ nhận ra rằng tôi đã nhận được điều đó ngược. Các FFT không thường xuyên là 64 điểm, do đó, việc triển khai một con bướm sẽ cần 32 * 5 = 160 đồng hồ. Các MAC sau đó có thể được thực hiện với số nhân phần cứng 200-250.
Dave Tweed

đây là những gì làm tôi bối rối Làm thế nào xilinx có thể thiết kế một lõi có khả năng thực hiện các bản nháp 16k / 32k yêu cầu các hoạt động nhân thêm 400k (NlogN) mà tôi vẫn phải vật lộn với 41k của mình? chắc chắn phải có cách!
stanri

@Dave: Tôi tin bạn có nghĩa là 160 phép nhân chứ không phải 160 chu kỳ, chắc chắn? Không có gì hoàn toàn được nối tiếp trong một FFT ...
Brian Drumond

2

Nếu vấn đề này không có các ràng buộc thời gian thực khó khăn và có vẻ như nó không xảy ra - bạn chỉ muốn nó chạy "nhanh hơn", thì có vẻ như nó có thể được tăng tốc trên một hoặc nhiều GPU. Có một số thư viện phần mềm làm cho điều này trở thành một đề xuất tương đối đơn giản và điều này sẽ dễ dàng hơn so với việc chuyển thẳng sang phần cứng đồ họa tùy chỉnh.

Chỉ cần Google cho "thư viện hỗ trợ GPU" hoặc "thư viện tăng tốc GPU" để bắt đầu.


Thật thú vị, tôi đã đề cập đến GPU cho khách hàng khi tôi nghe về dự án này và anh ta không quan tâm.
stanri

@StaceyAnneRieck: Anh ấy có nói tại sao không?
Dave Tweed

Anh ta thực sự không nói lý do tại sao, chỉ là anh ta đã xem xét nó trước khi sử dụng một đồ họa có vẻ như ít hoạt động hơn. Tôi sẽ phải đưa nó lên một lần nữa.
stanri

@stanri: Ngay cả khi cuối cùng bạn thực hiện được việc triển khai FPGA, đối với tôi, GPU có thể là một cách tốt để "làm bánh mì" cho kiến ​​trúc hệ thống tổng thể. Bạn có (và bạn có thể chia sẻ không?) Một số loại biểu đồ luồng dữ liệu mức cao cho thuật toán và bạn có thể cho chúng tôi biết về lượng dữ liệu liên quan không? Không có câu trả lời cho những câu hỏi như thế này, sẽ rất khó để cung cấp cho bạn bất cứ điều gì ngoài những lời khuyên rất chung chung.
Dave Tweed

Đây thực sự là một thuật toán rất đơn giản, nó chỉ là quy mô khiến nó trở nên phức tạp. Về cơ bản như sau: điều kiện ban đầu -> 512 bản sao song song -> 32768 phép toán nhân trên đầu ra FFT -> điều chỉnh các điều kiện ban đầu -> rửa và lặp lại
stanri

1

Có thể sử dụng một phần cứng chuyên dụng hoặc một đồ họa (hoặc thậm chí là CPLD) để tăng tốc đáng kể các loại hoạt động toán học nhất định. Điều quan trọng cần lưu ý khi cố gắng thiết kế phần cứng (mạch hoặc logic Logic) để tăng tốc các hoạt động toán học là tìm ra dữ liệu thứ tự nào sẽ cần phải đi vào và ra khỏi thiết bị của bạn. Một thiết bị có bố cục I / O hiệu quả có thể cung cấp hiệu suất tốt hơn nhiều so với thiết bị có bố cục không hiệu quả, ngay cả khi thiết bị sau yêu cầu nhiều mạch hơn.

Tôi đã không thử tạo ra một thiết kế hỗ trợ phần cứng cho FFT, nhưng một cái tôi đã xem là hỗ trợ phần cứng cho các hoạt động nhân lớn (như có thể được sử dụng cho mã hóa RSA). Nhiều bộ vi điều khiển, ngay cả những bộ có phần cứng nhân nhanh đặc biệt, không hiệu quả khủng khiếp trong các hoạt động như vậy bởi vì chúng đòi hỏi nhiều sự xáo trộn đăng ký. Phần cứng được thiết kế để giảm thiểu việc hoán đổi đăng ký có thể đạt được hiệu năng tốt hơn nhiều với các hoạt động nhân đa độ chính xác, ngay cả khi bản thân phần cứng không tinh vi. Ví dụ, phần cứng có thể thực hiện phép nhân 16xN theo đường ống hai lần một lần (dịch chuyển hai bit nhân thấp hơn và chuyển ra hai bit trên của kết quả) có thể đạt được hiệu suất tốt hơn so với phần cứng có thể thực hiện nhân 8 lần trong một chu kỳ, mặc dù trước đây có thể mất ít mạch hơn (và, nhờ vào đường ống, có đường dẫn dữ liệu quan trọng ngắn hơn). Điều quan trọng là tìm ra "vòng lặp bên trong" của mã cần thiết sẽ trông như thế nào và tìm hiểu xem có bất kỳ sự thiếu hiệu quả nào có thể dễ dàng được loại bỏ.


Những loại hoạt động đặc biệt phù hợp với hình thức tối ưu hóa này? Tôi đã chỉnh sửa câu hỏi trên để chi tiết hơn một chút về bản chất của hoạt động nhân. Thiết kế hỗ trợ phần cứng nghe có vẻ thực sự thú vị!
stanri

0

Làm thế nào ít vấn đề chúng ta thời gian thực hiện?

Đây thực sự giống như một tình huống mà bạn thực sự nên thực hiện MCU mềm, một FPGA với MCU cứng tích hợp hoặc thậm chí là một thiết bị MCU riêng biệt và tuần tự hóa tất cả các hoạt động của bạn.

Giả sử bạn có thời gian thực hiện, thực hiện các FFT của bạn trong phần mềm sẽ dễ dàng gỡ lỗi hơn rất nhiều và có lẽ cũng đơn giản hơn rất nhiều khi thiết kế.


1
Thực hiện tính toán nặng nề trong CPU lõi mềm trên một đồ họa là điều ngớ ngẩn; nếu bạn định thực hiện tính toán trong kiến ​​trúc chương trình được lưu trữ (thứ gì đó nên được xem xét), do nó trên cpu (s) cứng hiệu suất cao, trong đó bạn không phải trả tiền phạt tốc độ của logic linh hoạt so với fab- thế hệ logic cứng.
Chris Stratton

@ChrisStratton - Điểm tốt. Đã thêm một ghi chú cho hiệu ứng đó.
Sói Connor

1
Ngay cả các CPU cứng tích hợp cũng sẽ không giữ được ngọn nến cho các bộ xử lý / GPU thông thường cho các tác vụ dựa trên phần mềm và sẽ có giá cao hơn nhiều.
Chris Stratton

@ChrisStratton - Tôi nghĩ kiến ​​trúc CPU cứng tích hợp phổ biến nhất là ARM hoặc POWER? Trong trường hợp đó, về cơ bản nó một CPU hàng hóa.
Sói Connor

1
Với câu hỏi về FPGA khác của bạn, việc xây dựng bảng đồ họa có thể là một kinh nghiệm học tập sẽ có giá cao hơn một chút so với ước tính. Tôi nghĩ rằng điều cần làm vào thời điểm này là cung cấp cho khách hàng một số giá hiệu năng / giá cứng từ các lần chạy điện toán đám mây thử nghiệm (cuối cùng có thể trở thành phần cứng được mua), so với một số ý tưởng về giá cao hơn và rủi ro cao hơn nhiều cho nỗ lực của FPGA .
Chris Stratton
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.