Home > CUDA, Computational Modelling > Phần 0: Từ GPU đến GPGPU

Phần 0: Từ GPU đến GPGPU

Lược sử về các thế hệ máy tính số (digital computer) đầu tiên có thể tham khảo ở đây. Đầu tiên, các máy tính số với màn hình hiện thông tin dạng text. Mọi xử lí tính toán do bộ vi xử lí trung tâm (Central Processing Unit – CPU)  thực hiện. Sau này, với sự ra đời của hệ điều hành hỗ trợ đồ họa, nhu cầu xử lí hình ảnh, video, tăng cao; đòi hỏi phải có một bộ xứ lí riêng, gọi là Graphic Processing Unit (GPU). GPU là một thành phần của card màn hình được gắn trên bo mạch chủ (mainboard). Lịch sử của GPU có thể xem ở đây.

Vì giới hạn của phần cứng, xu hướng tăng số lõi (cores) thay vì tăng xung nhịp (clock rate) đang trở nên phổ biến. CPU thì có multicores, còn GPU thì có many-cores. GPU, ngày nay, đã có thể hoạt động nhanh hơn cả CPU trong việc xử lí tính toán. Cụ thể nhờ số lượng cores lớn (vài trăm so với 2,4, hoặc 8 của CPU), tốc độ truy xuất bộ nhớ nhanh (85GB/s với G80, 150GB/s với GTX200). Nhờ thế, vai trò của GPU đã vượt ra ngoài phạm vi truyền thống; đó là chạy các ứng dụng tính toán.

GPU cung cấp tập lệnh có thể truy xuất dùng assembly ở cấp thấp, hoặc thông qua các hàm thư viện (APIs) được thiết kế cho các ứng dụng đồ họa ở cấp cao (2D lẫn 3D) là OpenGL, DirectX… Do đó, trước đây, việc lập trình cho các ứng dụng tính toán có truy xuất GPU đều dựa vào các hàm APIs của các thư viện đồ họa (DirectX, OpenGL).  Điều này gây ra khó khăn do đòi hỏi người lập trình cần có hiểu biết về lập trình đồ họa. Kĩ thuật lập trình này có tên gọi là General-Purpose computing on GPU (GPGPU). Tuy nhiên, GPU vẫn chưa thay thế hoàn toàn được CPU, do có nhiều tác vụ thực hiện hiệu quả hơn trên CPU. Do đó, GPU chỉ đóng vai trò là một co-processor.

Để giúp đơn giản hóa lập trình, AMD công bố (Nov. 2006) bộ tập lệnh APIs với tên gọi là Close to Metal (CTM), về sau đổi tên là Stream. NVIDIA  (Nov. 2006) với nền tảng Geforces 8 series (Geforce 8800) sau này cho ra CUDA.

Compute Unified Device Architecture (CUDA) được viết để sử dụng dưới dạng một thư viện mở rộng của ngôn ngữ C bao gồm một Software Development Kit (SDK) và các Application Programming Interface (API) . Các GPU của NVIDIA  về sau có hỗ trợ CUDA còn gọi là CUDA-capable GPU. Như vậy, CUDA vừa là khái niệm kiến trúc phần cứng và khái niệm phần mềm. Để cạnh tranh, hãng AMD cũng đưa ra một SDK/API tương tự  cho các GPU dòng ATI của hãng, gọi là Brook+.

Bên cạnh các mô hình lập trình song song này, còn có các mô hình lập trình song song khác: OpenCL (không phụ thuộc phần cứng), ComputeDirect (của Intel)… Ngoài các mô hình lập trình với bộ thư viện hoàn chỉnh đã đề cập, PGI tạo ra mô hình dùng các chỉ thị (directives) giống như OpenMP (OpenMP-based directives models), với sự hỗ trợ của trình biên dịch kèm theo, chuyển đổi những dòng codes bao bởi các chỉ thị này để chạy trên các GPU, gọi một cách tổng quát là Accelerate Programming Model – APM (sẽ giới thiệu sau).

Nói về CUDA, ngoài việc sử dụng ngôn ngữ C ban đầu, các ngôn ngữ khác cũng được hỗ trợ: Python (CuPython), Fortran (PGI Fortran CUDA-support), C++, Matlab. Tuy nhiên, hiện nay, với ngôn ngữ C vẫn là hoàn chỉnh nhất.

————————————————————————

Trước đây, số lệnh được thực thi tròng vòng 1s (instructions per seconds) là đơn vị dùng để đo tốc độ của CPU. Ngày nay, trong lĩnh vực tính toán khoa học, với việc tập trung nhiều vào khả năng tính toán (có sử dụng dấu chấm động – floating-point calculations), đơn vị để đo lường sức mạnh tính toán là floating point operations per second (FLOPS). LINPACK benchmarks là công cụ thường dùng để đo lường hiệu năng theo FLOPS trên CPU. Bù lại với khả năng tính toán nhanh (song song), phần cứng của GPU vẫn còn hạn chế. Ví dụ: các phép toán sine, cosine, hàm mũ không chính xác khi chạy trên GPU (với Geforce 80-class GPU), khả năng xử lí với độ chính xác kép (double-precision) chỉ bắt đầu từ Tesla 2 và còn giới hạn (do số core dành cho double-precision vẫn ít hơn số core dành cho single-precision).

Sau đây là một vài so sánh

  • Tháng 5, 2008, một siêu máy tính của quân đội Mĩ do IBM chế tạo đạt tốc độ 1 petaFLOPS = 1000 teraFLOPS ~ 1.026 quadrillion calculations per second
  • Dự kiến, có thể tạo ra máy tính đạt tốc độ 10 petaFLOPS năm 2012
  • Tháng 6, 2008, GPGPU của AMD (ATI Radeon HD4800 series) đạt tốc độ 1 teraFLOPS = 1000 gigaFLOPS
  • Năm 2008, bộ vi xử lí quad-core của Intel (Intel Core i7 965 XE) chỉ mới đạt 70 gigaFLOPS = 10^9 FLOPS – độ chính xác kép
  • Bộ vi xử lí SPARC64 VIIIfx Venus CPU của Fujitsu (năm 2008)  đạt tốc độ 128 GigaFLOPS.

Tesla thế hệ I (dùng chip G80 cho NVIDIA) chỉ hiệu quả với các phép toán độ chính xác đơn. Tesla thế hệ II có hỗ trợ phép toán độ chính xác kép (với 8 cores)

  1. với single precision calculations
  • nVidia’s Tesla C1060 GPU: 933 GFLOPS
  • AMD’s FireStream 9270: 1200 GFLOPS
  1. với double precision calculations
  • Nvidia Tesla C1060: 78 GFLOPS
  • AMD FireStream 9270: 240 GFLOPS

Các số liệu trên là ở môi trường lí thuyết. Hiện nay, CUDA được ưa chuộng hơn vì ngôn ngữ dùng là C/C++ thay vì dùng ngôn ngữ cấp thấp (assembly) như đối với CMI. Vì thế, các bài viết của tôi sẽ tập trung vào công nghệ CUDA; cùng với một số công nghệ liên quan với ngôn ngữ Fortran.

Tăng trưởng về tốc độ so sánh giữa CPU và GPU
Tăng trưởng về tốc độ so sánh giữa CPU và GPU

————————————————————————-

Nov, 2006, NVIDIA cho ra đời GeForce 8800 với 128 programmer shaders (sau này gọi là streaming processor core – SP). Cứ mỗi 8 cores gộp thành 1 streaming multiprocessor (SM). Vì thế GeForce 8800 có 16 SMs. Đây là thế hệ đầu tiên hỗ trợ CUDA. Các Tesla card thế hệ đầu (T8) dùng chip G80 (các dòng giá rẻ như G84, G86 không được sử dụng).

Tiếp sau NVIDIA 8 series là các thế hệ NVIDIA 9 series, 100 series.

June 2008, NVIDIA cho ra đời kiến trúc GT200 GPU, với số core tăng lên 30×8 = 240 SPs (hay 30 SMs). Các thế hệ GPU card sau dùng chip GT200: GeForce GTX280 (for consumer PCs), Quadro FX5800 (for workstations), và Tesla T10 (for high-performance computing).

NVIDIA Tesla chính là một  GPGPU đúng nghĩa. Đây là dòng GPU không có ngõ ra video, do đó, nó được thiết kế thuần túy cho tính toán. Các models hiện nay của Tesla là

  • 1st generation: C870, D870, S870,
  • 2nd generation: C1060, S1070;

đi theo 3 dạng: dạng card, dạng “external box” và dạng rack-mount server form, i.e. “C” viết tắt của “Card”, “D” viết tắt của “Desktop” và “S” viết tắt của “Server”.

  1. C870 dùng chuẩn PCI Express x16 (version 1) với thông số 1.5GB bộ nhớ và sức mạnh 518 GigaFLOPS – dùng chip G80 với 128 cores. Điện năng: 170W. (~1,500$)
  2. D870 được thiết kế dưới dạng 1 thùng độc lập (external box) gồm 2 card C870 nối với máy tính qua 1 cable PCI Express mở rộng, với sức mạnh 1 TetraFLOPS. Điện năng: 550W. (~7,500$)
  3. S870 được thiết kết với 4 card C870 theo kiến trúc Rack-Mount server form (1U), có thể nối với máy chủ qua cable PCI Express mở rộng, với sức mạnh đến 2 TetraFLOPS. Điện năng: 800W. (~12,000$)

CHÚ Ý: Các thông số trên là cho single-precision calculations.

Khả năng tiêu hao điện thấp là một điểm mạnh của GPGPU. Một GeForce GPU có khả năng tương đương 40 vi xử lí x86. Trong khi, với số lượng vi xử lí x86 đó cần 1600W.

Tesla D870 (price: 7500 USD)
Tesla S870 (price: 12000 USD)
Tesla S870 (price: 12000 USD)

Tesla T10 (thế hệ 2) với 2 phiên bản C1060 và S1070. T10 sử dụng chip GT200 series gồm 240 cores (gần gấp đôi so với 128 cores của G80 series) có khả năng xử lí 1 teraFLOPS gần gấp đôi Tesla GPU thế hệ đầu, cùng với độ chính xác cao hơn (64bit) và RAM tăng. Một số hình ảnh về GPU Tesla có thể tham khảo ở đây.

  1. C1060 giống như 1 card màn hình hơi to, kết nối cổng PCI Express x16 (version 2), chứa 1 chip T10P (mỗi core tốc độ 1.33GHz, 4GB 800MHz GDDR3 RAM, băng thông bộ nhớ là 102GB/s), tốc độ 900 gigaFLOPS. Điện năng: 160W. ($1699)
  2. S1070 1U kích thước nhỏ hơn, với 4 chip T10P, i.e. 4×240=960 cores, tốc độ 4 tetraFLOPS. Mỗi chip tốc độ 1.5GHz, 16GB 800MHz GDDR3 RAM với băng thông bộ nhớ là 408 GB/s. Điện năng: 700W. ($7995 – 2PCIe interfaces, $8295 – 1 PCIe interface)

——————————————————————–

Tesla Fermi (thế hệ 3) dự kiến sẽ ra đời sớm. Nó dùng chip G300 series, GT300 hoặc NV60, không có ngõ ra DVI-I. Chip thế hệ mới có 512 cores (hơn gấp đôi so với thế hệ 2) hỗ trợ chuẩn IEEE 754-2008 floating-point standard, công nghệ sữa lỗi ECC (error-correcting code). Các kernels (khái niệm mới này sẽ được giới thiệu ở các bài sau) có thể chạy song song. Bên cạnh đó là sự ra đời của Nexus – môi trường để phát triển các ứng dụng cho tính toán, được tích hợp với Microsoft Visual Studio. Sau đây là một số so sánh với 2 thế hệ đầu.

So sánh các thế hệ của Tesla
So sánh các thế hệ của Tesla

Yêu cầu:

  1. máy tính có cài đặt 1 GPGPU: Geforces 8 series, 9 series, 100 series, 200 series, Quadro, and Tesla.
  2. CUDA toolkit, CUDA SDK, NVIDIA driver…
  3. chương trình được viết và biên dịch với compiler (gcc, hay PGI Fortran)

Update:

  1. Intel Nehalem với 4 cores, tốc độ 50GFLOPS, tiêu thụ 80W/h (price: $500).
  2. NVIDIA Fermi chips ~8 times faster than Tesla in double-precision computing, providing ECC (error correcting code) memory, double-precision

Tham khảo:

  1. http://gpgpu.org/
  2. http://ati.amd.com/technology/streamcomputing/gpgpu_history.html (GPGPU history from AMD)
  3. http://gpgpu.org/oldsite/data/history.shtml
  4. http://www.techradar.com/news/computing-components/processors/world-s-fastest-cpu-clocked-at-128-gigaflops-599433
  5. http://www.thegioimaychu.vn/forum/showthread.php?p=1127
  6. http://www.thongtincongnghe.com/article/356
  7. http://www.tomshardware.com/reviews/nvidia-cuda-gpu,1954-2.html
  8. http://www.vizworld.com/2009/06/nvidia-and-pgi-partner-to-bring-cuda-to-fortran/
  9. http://www.tgdaily.com/index.php?option=com_content&task=blogsection&id=18&Itemid=41&slideshow=20070620
  10. http://penstarsys.com/previews/graphics/nvidia/tesla/tesla_2.htm
  11. http://www.tomshardware.com/news/Tesla-C1060-S1070,5672.html
  12. http://www.xbitlabs.com/news/video/display/20090930223729_First_Images_of_Nvidia_GeForce_Fermi_Show_Up.html
  13. http://hothardware.com/News/NVIDIA-Unveils-Next-Generation-Fermi-GPU-Architecture/

Updated:

- Feb, 04, 2010

- March 24, 2010