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.