Làm thế nào nhanh chóng để nhân 64 hoặc chia thực hiện trên một đồ họa?


8

Khi sử dụng một GPU thông thường như Xilinx Spartan 3 hoặc Virtex 5, một phép nhân hoặc phép chia 64 bit dấu phẩy động có độ chính xác kép sẽ thực hiện bao nhiêu chu kỳ?

Theo như tôi hiểu, thì FPGA không có một FPU cứng và bạn cần tạo một cái bằng cách sử dụng các thư viện chuẩn của IEEE hoặc các tài liệu khác. Điều này có nghĩa là nó sẽ không thực thi trong một chu kỳ duy nhất, vì vậy tôi đang tìm kiếm một ước tính sơ bộ để so sánh hiệu suất của CPU 100 Mhz với một Spartan / Virtex 100 MHz.

Tôi chủ yếu quan tâm đến các toán tử dấu phẩy động, nhưng nếu bạn có kinh nghiệm với các phép toán số nguyên cũng sẽ được đánh giá cao.


3
Đầu tiên, cần làm rõ câu hỏi: bạn nói về MPY / phép chia 64 bit, nghĩa là nhân / chia số nguyên 64 bit - sau đó bạn đề cập đến FPU, hàm ý điểm nổi chính xác kép. Chi tiết câu trả lời sẽ khác nhau cho mỗi ...
Brian Drumond

2
Đối với một phép nhân tại một thời điểm, thời gian có thể tương đương hoặc hơi nghiêng về CPU. Rõ ràng lợi thế của FPGA là bạn có thể có rất nhiều trong số chúng song song.
pjc50

Câu trả lời:


12

Tôi đã không làm điều này cho FP chính xác gấp đôi, nhưng các nguyên tắc tương tự được áp dụng như đối với độ chính xác đơn, mà tôi đã thực hiện phép chia (nhân với tỷ lệ nghịch đảo).

Những gì các GPU này có, thay vì các FPU, là các khối DSP / số nhân được tăng cường, có khả năng thực hiện phép nhân 18 * 18 hoặc (Virtex-5) 18 * 25 trong một chu kỳ. Và các thiết bị lớn hơn có khoảng một nghìn trong số này, hoặc thậm chí 126 hoặc 180 ở đầu cuối của gia đình Spartan-3 hoặc Spartan-6.

Vì vậy, bạn có thể phân tách một phép nhân lớn thành các phép toán nhỏ hơn bằng cách sử dụng một vài trong số này (2 cho Virtex-5 thực hiện độ chính xác đơn) bằng cách sử dụng bộ cộng DSP hoặc vải FPGA để tổng hợp các sản phẩm một phần.

Bạn sẽ nhận được câu trả lời trong một vài chu kỳ - 3 hoặc 4 cho SP, có thể là 5 cho DP - tùy thuộc vào cách bạn soạn cây bộ cộng (và đôi khi, trong đó các công cụ synth nhấn mạnh vào việc thêm các thanh ghi đường ống!).

Tuy nhiên, đó là độ trễ - vì nó được đặt trong đường ống, thông lượng sẽ là 1 kết quả cho mỗi chu kỳ đồng hồ.

Để phân chia, tôi đã xấp xỉ một toán tử đối ứng bằng cách sử dụng bảng tra cứu theo sau là phép nội suy bậc hai. Điều này chính xác đến tốt hơn độ chính xác đơn và sẽ mở rộng (với nhiều phần cứng hơn) đến DP nếu tôi muốn. Trong Spartan-6, nó cần 2 BlockRams và 4 DSP / số nhân, và vài trăm cặp LUT / FF.

Độ trễ của nó là 8 chu kỳ, nhưng một lần nữa thông lượng là chu kỳ đơn, do đó, bằng cách kết hợp nó với hệ số nhân ở trên, bạn sẽ có được một phân chia cho mỗi chu kỳ đồng hồ. Nó sẽ vượt quá 100 MHz trong Spartan-3. Trong Spartan-6, ước tính tổng hợp là 185 MHz nhưng với 1.6ns trên một đường định tuyến duy nhất, vì vậy 200 MHz là lý do.

Trong Virtex-5, nó đạt tới 200 MHz mà không cần nỗ lực, cũng như bộ đôi căn bậc hai của nó. Tôi đã có một vài sinh viên mùa hè cố gắng nối lại nó - với độ trễ dưới 12 chu kỳ, họ đã đạt gần 400 MHz - 2,5 ns cho một căn bậc hai.

Nhưng hãy nhớ rằng bạn có thể có một trăm đến một nghìn đơn vị DSP? Điều đó mang lại cho bạn một hoặc hai đơn đặt hàng sức mạnh xử lý lớn hơn một đơn vị FP.


Cảm ơn câu trả lời của bạn, Brian, nhưng đây không phải là toàn bộ câu trả lời của bạn về phép nhân / chia số nguyên? Tôi chủ yếu quan tâm đến điểm nổi.
Robinicks

2
Không, như tôi đã nói, độ chính xác duy nhất, có nghĩa là điểm nổi 32 bit. Các nguyên tắc tương tự áp dụng cho nhân đôi, nhưng việc sử dụng tài nguyên rõ ràng là cao hơn.
Brian Drumond

5

Khi sử dụng một GPU thông thường như Xilinx Spartan 3 hoặc Virtex 5, một phép nhân hoặc phép chia 64 bit dấu phẩy động có độ chính xác kép sẽ thực hiện bao nhiêu chu kỳ?

Câu trả lời là: Có!

Nhưng nghiêm túc, thật khó để đưa ra một con số. Khi thiết kế bất kỳ logic phức tạp nào, luôn có sự đánh đổi giữa những thứ khác nhau và không có cách tiếp cận nào tốt cho tất cả các thiết kế. Tôi sẽ cố gắng che những cái lớn.

Với thiết kế logic, một sự đánh đổi là kích thước so với tốc độ. Ví dụ dễ hiểu về điều này là giả sử rằng một số nhân Dấu phẩy động quá chậm. Để tăng tốc tất cả những gì bạn phải làm là thêm một số nhân thứ hai. Kích thước logic của bạn tăng gấp đôi, nhưng thực hiện số nhân mỗi giây. Nhưng ngay cả khi chỉ nhìn vào một số nhân, có nhiều cách khác nhau để nhân số; một số thì nhanh và lớn, số khác thì nhỏ và chậm.

Một sự đánh đổi khác là tốc độ xung nhịp so với đồng hồ trên mỗi bội số. Tôi có thể thiết kế một số logic sẽ thực hiện một dấu phẩy động nhân trong một đồng hồ. Nhưng điều đó cũng đòi hỏi đồng hồ phải chậm hơn - có thể chậm đến 10 MHz. Hoặc, tôi có thể thiết kế nó để hoạt động với đồng hồ 100 MHz nhưng nó sẽ yêu cầu 10 đồng hồ trên mỗi nhân. Tốc độ tổng thể là như nhau (một nhân trong 100 ns), nhưng một tốc độ nhanh hơn.

Liên quan đến đoạn trước là sự đánh đổi tốc độ xung nhịp so với độ trễ nhân. Có một kỹ thuật trong thiết kế logic gọi là pipelining. Về cơ bản, bạn lấy một đoạn logic và chia nó thành các giai đoạn nhỏ hơn, trong đó mỗi giai đoạn mất một chu kỳ đồng hồ để hoàn thành. Ưu điểm ở đây là mỗi giai đoạn có thể làm việc trên bội số trong khi các giai đoạn khác đang làm việc trên các bội số khác. Ví dụ: giả sử chúng ta đang chạy ở 100 MHz với đường ống 10 giai đoạn. Điều này có nghĩa là nó sẽ mất 10 đồng hồ cho mỗi bội số, nhưng logic cũng hoạt động trên 10 bội số khác nhau cùng một lúc! Điều thú vị là nó đang hoàn thành một bội số trên mỗi chu kỳ đồng hồ. Vì vậy, đồng hồ hiệu quả trên mỗi bội số là 1, chỉ cần 10 đồng hồ cho mỗi lần nhân đó để hoàn thành.

Vì vậy, câu trả lời cho câu hỏi của bạn, một đồ họa có thể nhân lên nhanh như thế nào, thực sự tùy thuộc vào bạn. Các GPU có các kích cỡ và tốc độ khác nhau và bạn có thể dành bao nhiêu logic đó cho nhiệm vụ trong tay nếu muốn. Nhưng hãy nhìn vào một kịch bản cụ thể ...

Giả sử chúng ta muốn sử dụng Spartan-3A lớn nhất và tất cả những gì chúng ta quan tâm là bội số dấu phẩy động 32 bit. Phép nhân float 32 bit yêu cầu hệ số nhân 24x24 và bộ cộng 8 bit. Điều này đòi hỏi bốn trong số các khối nhân chuyên dụng và một số lát cắt chung (quá ít để quan tâm). XC3S1400A có 32 số nhân chuyên dụng, vì vậy chúng tôi có thể thực hiện song song tám số nhân dấu phẩy động. Một dự đoán rất sơ bộ về tốc độ xung nhịp sẽ là khoảng 100 MHz. Chúng tôi hoàn toàn có thể dẫn đường cho thiết kế này để có thể hoàn thành bốn bội số điểm 32 bit trên mỗi chu kỳ đồng hồ, cho tốc độ hiệu quả là 800 triệu nhân điểm trôi nổi mỗi giây.

Một bội số chính xác kép đòi hỏi 9 khối nhân chuyên dụng cho mỗi bội số của dấu phẩy động, do đó chúng tôi chỉ có thể thực hiện song song 3 bội số - dẫn đến tốc độ nhân lên khoảng 300 triệu điểm nổi 64 bit mỗi giây.

Để so sánh, hãy xem xét loạt Xilinx Virtex-7 mới hơn. Số nhân chuyên dụng trong đó lớn hơn, vì vậy chúng tôi chỉ cần 6 khối nhân dành riêng cho số nhân dấu phẩy động 64 bit. Ngoài ra còn có 1.920 bội số chuyên dụng trên phần lớn nhất-- vì vậy chúng ta có thể thực hiện song song 320 phép nhân dấu phẩy động chính xác. Những phần đó cũng nhanh hơn nhiều. Tôi ước tính rằng chúng ta có thể chạy các phần đó ở tốc độ 200 MHz, cho chúng ta tổng tốc độ là 64 BILLION nhân bội số chính xác gấp đôi mỗi giây. Tất nhiên, những con chip đó có giá khoảng US $ 10.000 mỗi con.

Phân chia điểm nổi khó hơn nhiều để làm nhanh. Logic này lớn hơn nhiều, đặc biệt là trong một đồ họa và nó chạy chậm hơn nhiều. Điều này cũng đúng với hầu hết các CPU, trong đó các hướng dẫn phân chia (điểm nổi và điểm cố định) chạy chậm hơn nhiều. Nếu tốc độ là quan trọng thì bạn muốn loại bỏ càng nhiều phân chia càng tốt. Ví dụ, thay vì chia cho 5, bạn nên nhân với 0,2. Trong thực tế, trên nhiều hệ thống, việc tính toán đối ứng sẽ nhanh hơn và thực hiện bội số so với chỉ thực hiện phép chia.

Sự đánh đổi tương tự áp dụng cho phép chia như phép nhân - chỉ là phép chia đó sẽ luôn chậm hơn và lớn hơn nhiều so với phép nhân.


Một TI DSP hoặc thậm chí là GPU trên Rasberry Pi 3 sẽ hút khói ma thuật ra khỏi thứ đã từng là ALU trên FPGA.
dhchdhd

3

Ít nhất là trên thành phần phân chia Altera ALT_FP, phân chia 64 bit chính xác kép (mantissa 52 bit) mất 10, 24 hoặc 61 chu kỳ đồng hồ (có thể chọn). Độ chính xác duy nhất mở rộng có thể khác nhau. Ví dụ: phân chia 43 bit trong đó số mũ là 11 bit, mantissa là 26 bit cho phép chọn các tùy chọn độ trễ đầu ra đồng hồ như vậy: 8, 18 hoặc 35. Bắt đầu ISE và kiểm tra những gì bạn có thể có trên Xilinx.


1
Là những con số độ trễ, hoặc thông lượng?
Brian Drumond

Chu kỳ đồng hồ chính xác gấp đôi được lựa chọn? Do yếu tố nào? Để sử dụng nhiều hơn / ít khối hơn? Và nhân lên thì sao?
Robinicks

1
Tôi đã không di chuyển cùng với các tham số thành phần, chỉ bắt đầu một cửa sổ chính và sao chép những gì nó nói. Có lẽ cần phải đọc tài liệu và kiểm tra những thông số khác mà thành phần gui cung cấp. Vì vậy, về cơ bản, bây giờ tôi không thể trả lời cho cả hai câu hỏi.
Socrates

2

Không có lý do gì nó không thể mất một chu kỳ. Tuy nhiên, đây có thể là một chu kỳ khá lớn và sử dụng nhiều tài nguyên ...


1

Tôi có các triển khai nhân chính xác, nhân và chia điểm. Phép nhân mất 13 chu kỳ đồng hồ và phép chia mất 109 chu kỳ đồng hồ. Cả hai đều được cung cấp cho thông lượng 100% (một kết quả trên mỗi đồng hồ) và hoạt động khoảng 200 MHz trên Xilinx V5. Tôi không biết bạn có thể nhận được bao nhiêu đồng hồ ít hơn ở 100 MHz, nhưng chia cho hai sẽ là một đặt cược an toàn.

Tôi cũng có các triển khai điểm nổi chính xác đơn, mất 10 và 51 đồng hồ trong cùng một tình huống.

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.