Markt có điều này gần như đúng, nhưng tôi sẽ ném 2 xu của mình vào đây:
Hãy tưởng tượng rằng tôi đã nói với bạn rằng tôi muốn viết một chương trình đảo ngược thứ tự các bit bên trong một số nguyên 32 bit. Một cái gì đó như thế này:
int reverseBits(int input) {
output = 0;
for(int i = 0;i < 32;i++) {
// Check if the lowest bit is set
if(input & 1 != 0) {
output = output | 1; // set the lowest bit to match in the output!
}
input = input >> 1;
output = output << 1;
}
return output;
}
Bây giờ việc triển khai của tôi không thanh lịch, nhưng tôi chắc chắn rằng bạn đồng ý rằng sẽ có một số hoạt động liên quan đến việc này và có thể là một số vòng lặp. Điều này có nghĩa là trong CPU, bạn đã dành hơn 1 chu kỳ để thực hiện thao tác này.
Trong một đồ họa, bạn có thể đơn giản nối dây này thành một cặp chốt. Bạn nhận được dữ liệu của mình vào một số thanh ghi, sau đó bạn nối nó vào thanh ghi khác theo thứ tự bit ngược. Điều này có nghĩa là hoạt động sẽ hoàn thành trong một chu kỳ xung nhịp duy nhất trong FPGA. Do đó, trong một chu kỳ duy nhất, FPGS đã hoàn thành một hoạt động khiến CPU mục đích chung của bạn mất hàng ngàn chu kỳ để hoàn thành! Ngoài ra, bạn có thể kết nối song song vài trăm thanh ghi này. Vì vậy, nếu bạn có thể di chuyển vài trăm số vào FPGA, trong một chu kỳ duy nhất, nó sẽ hoàn thành hàng ngàn thao tác đó hàng trăm lần, tất cả trong 1 chu kỳ xung nhịp của FPGA.
Có rất nhiều điều mà CPU có mục đích chung có thể làm, nhưng như một hạn chế, chúng tôi thiết lập các hướng dẫn đơn giản và tổng quát mà nhất thiết phải mở rộng thành danh sách các hướng dẫn đơn giản để hoàn thành một số tác vụ. Vì vậy, tôi có thể làm cho CPU có mục đích chung có một lệnh như "thứ tự bit đảo ngược cho thanh ghi 32 bit" và cung cấp cho CPU khả năng tương tự như FPGA mà chúng ta vừa xây dựng, nhưng có vô số hướng dẫn hữu ích như vậy, và vì vậy chúng tôi chỉ đưa vào những cái đảm bảo chi phí trong các CPU phổ biến.
Các GPU, CPLD và ASIC đều cung cấp cho bạn quyền truy cập vào phần cứng thô, cho phép bạn xác định các hoạt động điên rồ như "giải mã các byte được mã hóa AES256 bằng khóa" hoặc "giải mã khung hình của video h.264". Chúng có độ trễ hơn một chu kỳ xung nhịp trong một đồ họa, nhưng chúng có thể được thực hiện theo cách hiệu quả hơn nhiều so với việc viết ra hoạt động trong hàng triệu dòng mã lắp ráp mục đích chung. Điều này cũng có lợi ích là làm cho FPGA / ASIC có mục đích cố định cho nhiều hoạt động trong số này hoạt động hiệu quả hơn vì chúng không phải thực hiện nhiều công việc ngoại lai!
Tính song song là phần khác được đánh dấu chỉ ra, và mặc dù điều đó cũng quan trọng, nhưng điều chính là khi một GPU song song một thứ vốn đã đắt trong CPU theo các chu kỳ cần thiết để thực hiện thao tác. Khi bạn bắt đầu nói "Tôi có thể thực hiện trong 10 chu kỳ FPGA, một nhiệm vụ phải thực hiện 100.000 chu kỳ CPU của tôi và tôi có thể thực hiện nhiệm vụ này song song 4 mục một lần", bạn có thể dễ dàng thấy tại sao một FPGA có thể là một công việc khó khăn nhanh hơn CPU!
Vậy tại sao chúng ta không sử dụng các GPU, CPLD và ASIC cho mọi thứ? Bởi vì nói chung nó là một con chip hoàn toàn không làm gì ngoài một thao tác. Điều này có nghĩa là mặc dù bạn có thể có được một quy trình để chạy nhiều đơn hàng cường độ nhanh hơn trong FPGA / ASIC của mình, bạn không thể thay đổi nó sau này khi thao tác đó không còn hữu ích. Lý do bạn không thể (nói chung) thay đổi một khi một mạch là vì hệ thống dây điện cho giao diện đã được sửa chữa và thông thường, mạch không bao gồm các thành phần cho phép bạn lập trình lại sơ đồ thành một cấu hình hữu ích hơn. Có một số nhà nghiên cứu đang cố gắng xây dựng các mô-đun hybrid-CPU lai, trong đó có một phần của CPU có khả năng được tua lại / lập trình lại như một đồ họa, cho phép bạn "tải" một phần hiệu quả của CPU,