You are on page 1of 68

GPU DEVELOPMENT AND

NVIDIA’S APPLICATIONS

Nguyễn Minh Sơn, Ph.D.


Giới thiệu
Nội dung trình bày 01 - Giới thiệu về GPU: Cấu tạo, chức năng, phân loại
- Ứng dụng của GPU: Lựa chọn GPU phù hợp, ứng dụng của GPU hiện nay

Các tính năng của GPU


02 - Các tính năng của GPU
- Graphic Pipeline
- Ray Tracing Algorithms

Công nghệ GPU của Nvidia


03 - Ngôn ngữ lập trình song song CUDA.
- Mô hình lập trình
- Giao diện lập trình và Biên dịch với NVCC

Case study và Demo


04 - Demo OpenCL
- Case study: dự án Folding@Home

Tóm tắt
05
Giới thiệu
GPU là gì?
• GPU viết tắt của Graphic Processing Unit, là đơn
vị xử lý tín hiệu đồ họa.
• GPU được hình thành và phát triển từ rất sớm, và
có lịch sử lâu đời tương tự CPU.
• GPU được phân thành nhiều nhóm có nhiều chức
năng khác nhau giúp người dùng dễ dàng lựa
chọn theo nhu cầu sử dụng đồ họa.
• GPU ngày nay được xem là một phần không thể
thiếu trong các hệ máy tính (hệ thống nhúng, điện
thoại di động, máy tính cá nhân, máy trạm, và
điều khiển game)
Cấu tạo của GPU

Add Text
So sánh CPU vs GPU
So sánh CPU vs GPU

Nhiệm vụ chính của CPU là GPU được thiết kế chuyên để thực


CPU xử lý các chương trình vi tính
và dữ kiện, xử lý dữ liệu theo
GPU hiện các tác vụ đồ họa, bao gồm cả
việc tạo nên giao diện để giao tiếp với
chương trình được thiết lập người dùng, cho tới các tác vụ tính
Add Text từ trước toán, xử lý game, ứng dụng 2D/3D…

Vai trò – Nhiệm vụ


So sánh CPU vs GPU
Mật độ tính toán thấp Mật độ tính toán cao
Kiểm soát logic phức tạp Tính toán cao trên mỗi lần truy cập bộ nhớ (Memory)
Bộ nhớ Cache lớn (L1, L2, …)
Tối ưu hóa cho các xử lý nối tiếp: Được xây dựng cho xử lý song song:
- Ít đơn vị thực thi hơn (ALU) - Nhiều đơn vị thực thi song song (ALU)
- Xung clock cao hơn GPU - Đồ họa dùng xử lý song song tốt hơn CPU
Pipeline cạn (<30 stage) Pipeline sâu (hàng trăm stage)
Lưu lượng (throughput) cao
Dung sai độ trễ thấp Dung sai độ trễ cao
CPU mới có nhiều xử lý song song hơn GPU mới:
- Logic điều khiển luồng tốt hơn (trở nên giống CPU
hơn)
- Phân tán/ Thu thập truy xuất bộ nhớ
- Không có pipeline 1 chiều nữa
Phân loại GPU
GPU Tích hợp
GPU tích hợp trên Chipset cầu bắc,
hoặc bên trong CPU, sử dụng RAM GPU Mobile card
hệ thống để làm bộ đệm. Dành cho hệ máy di động như
Ưu điểm: G Laptop, Notebook, Netbook… đáp
- Tích hợp, giá rẻ, giúp làm gọn mainboard T íc P U
hh
ợp U d ứng nhu cầu xử lý đồ họa tầm
- Tiết kiệm năng lượng, phù hợp với máy G P c ar
tính di động o b il
e trung, gaming,…
M
Nhược điểm:
- Hiệu suất yếu, không đáp ứng được yêu
cầu đồ họa cấp cao và gaming
- RAM hệ thống giảm đi do phải chia sẻ GPU
cho GPU Card

GPU Card
Dành cho máy WorkStation và Desktop yêu
cầu năng lực xử lý đồ họa cao cấp.

Các giao tiếp GPU card: PCI, AGP, PCI Express


Phân loại GPU
GPU Tích hợp
Phân loại GPU

GPU Card
Phân loại GPU

GPU Mobile card


Lựa chọn GPU phù hợp
Mục đích sử dụng GPU đề nghị
Gaming - GeForce GTX, RTX
- Nvidia Titan X
- AMD Radeon HD
- Các dòng AMD Radeon R5, R7,
R9, RX, Vega và Navi
Cloud gaming (chơi game trên nền tảng đám mây) - Nvidia Grid
- AMD Radeon Sky
Máy trạm - Nvidia Quadro
- Nvidia Titan X
- AMD FirePro
- AMD Radeon Pro
- AMD Radeon VII
Máy trạm cloud - Nvidia Tesla
- AMD FireStream
Artificial Intelligence Cloud (trí tuệ nhân tạo trên nền tảng đám mây) - Nvidia Tesla
- AMD Radeon Instinct
Xe tự động / không người lái - Nvidia Drive PX
Ứng dụng của GPU

Game
Ứng dụng của GPU

Trí
tuệ
nhân
tạo Add Title
You can simply impress your
audience and add a unique
Add Title
You can simply impress your
audience and add a unique
Add Title
You can simply impress your
audience and add a unique
zing and appeal to your zing and appeal to your zing and appeal to your
Presentations. Presentations. Presentations.
Ứng dụng của GPU

Lái
xe tự
động
Add Title Add Title Add Title
You can simply impress your You can simply impress your You can simply impress your
audience and add a unique audience and add a unique audience and add a unique
zing and appeal to your zing and appeal to your zing and appeal to your
Presentations. Presentations. Presentations.
Một số tính năng của GPU
Tính năng GPU

GAMES BITCOIN GRAPHIC DESIGN VIDEO OTHER


2D – 3D Render Tính toán y khoa, điện tử,
Thiết kế kỹ thuật, dựng 2K – 4K – 8K mô hình tài chính, nghiên
phim, làm hiệu ứng trong VR cứu khoa học hiện đại và
phim điện ảnh và phim những lĩnh vực liên quan
hoạt hình. tới thăm dò dầu khí...
Tính năng hỗ trợ Game
Anti-Aliasing FPS

Anti-Aliasing - Khử răng cưa

Texture Quality Frames per second


(FPS)
Texture Quality

Ray Tracing
Ray Tracing
Graphic Pipeline
GRAPHIC PIPELINE
GRAPHIC PIPELINE
Resource: id, vị trí, màu sắc, thuộc tính, texture.

Xử lý resource và tạo ra các ma trận tọa độ điểm

Từ các điểm tạo ra các tam giác riêng biệt từ các điểm cho

Pixel hóa từ các tam giác đã tạo

Đổ màu cho các pixel

Ghép các tam giác pixel với nhau để tạo thành hình ảnh 3d hoàn chỉnh

Xuất hình ảnh sau xử lý ra màn hình


Vertex Processing

Vertices
Position
(vị trí, màu sắc, thuộc tính)
Vertex Processing

Vertices Primitives (triangles)


Primitive Processing
Pixel operations

Vertices
Primitives (triangles) Pixel
Pipeline
Graphic Pipeline
Ray Tracing Algorithms
Ray Tracing Algorithms
CUDA – NGÔN NGỮ LẬP TRÌNH SONG SONG
Giới thiệu chung
• Sự ra đời của bộ xử lý đa lõi CPU và đa nhân
GPU có thể hiểu là việc sử dụng nhiều chip xử lý
cùng thực hiện trong các hệ thống song song.
• Những thách thức đặt ra trong việc phát triển
phần mềm cho thấy việc ứng dụng sự song song
trong tiến trình chạy lệnh bởi sự gia tăng số lượng
lõi của bộ xử lý là rất cần thiết và quan trọng. Đặc
biệt trong việc xử lý các lệnh của ứng dụng đồ
họa 3D.
Giới thiệu về CUDA
• CUDA là một ngôn ngữ lập trình và môi trường
phần mềm do hãng NVIDIA thiết kế và phát triển Compute Unified
dựa trên cơ sở kiến trúc Tesla. Device Architecture
è CUDA rất thích hợp với khả năng tính toán song
song của GPU, dễ tiếp cận đối với các lập trình viên
và thân thiện với ngôn ngữ lập trình chuẩn như C.
• CUDA Core là một nhân xử lý các phép tính dành
cho GPU, tương tự như Core của CPU nhưng
đơn giản hơn. Số lượng Core của CPU thường là
1, 4,… cho đến 16, 32 nhưng CUDA Core có đến
hàng trăm, hàng nghìn.
Latest version: CUDA 11
è CUDA Core càng nhiều, GPU càng xử lý được
nhiều phép tính cùng một lúc.
Giới thiệu về CUDA

• Trước CUDA, đã có các shader khác nhau trong GPU. Các shader như: shader
pixel, shader vertex, shader geometry, shader fragment, shader hình học,…các
GPU có các đơn vị tính toán riêng cho chúng.
è Với sự ra đời của CUDA, cùng một đơn vị tính toán có khả năng xử lý tất cả các
loại shader.
è Ngày nay, CUDA được gọi là API được sử dụng để thực hiện lập trình song song
trên hàng trăm lõi CUDA có sẵn trong GPU NVIDIA.
GPU: Bộ xử lý nhiều lõi song song
Được xây dựng do yêu cầu của thị trường, đồ họa 3D phân giải cao, GPU có thể
lập trình phát triển thành bộ xử lý nhiều lõi song song và đa luồng với tốc độ tính
toán cực cao và băng thông rất rộng.

Add Text
GPU: Bộ xử lý nhiều lõi song song

• Xử lý song song dữ liệu nối các phần tử của dữ liệu với các luồng xử lý song song.
Nhiều ứng dụng xử lý lượng lớn tập dữ liệu có thể dung mô hình lập trình song song
để tăng tốc độ tính toán. Ví dụ, render đồ họa 3D, một tập các điểm và đường thẳng
đứng được nối với các luồng song song..
• Nguyên nhân của sự chênh lệch giữa CPU và GPU là do GPU được thiết kế đặc
biệt vớiAdd
khảText năng tính toán mạnh, tính toán song song cao. Cụ thể, do yêu cầu

render của đồ họa và do đó nó được thiết kế nhiều transistor hơn để sử dụng cho
việc xử lý dữ liệu trên Cache và Control Unit.
Mô hình lập trình CUDA
(Programming Model)
• CUDA mở rộng C bằng việc cho phép người lập trình định nghĩa các hàm của C,
được gọi là Kernels, khi được gọi nó được thực hiện N lần song song bởi N luồng
CUDA khác nhau.
• Một Kernel được định nghĩa bằng việc dùng thuộc tính __global__ để khai báo và số
lượng thread cho mỗi lời gọi được chỉ ra bằng việc sử dụng cú pháp <<<…>>>

Add Text
Mô hình lập trình CUDA
(Programming Model)

• Mỗi thread thực hiện một kernel mang một threadID riêng, nó
chứa bên trong thread và được tạo bởi biến threadIdx.
• Phân cấp thread: threadIdx có 3 vector, nhờ đó những thread có
thể được định nghĩa bằng việc dung 1, 2 hay 3 chiều chỉ số. Chỉ
số của thread và threadID có liên quan tới nhau.
• Thread bên trong block có thể kết hợp với nhau bằng việc chia
sẻ dữ liệu thông qua vài vùng nhớ chia sẻ và đồng bộ hóa việc
thực hiện chúng theo điều kiện truy nhập vùng nhớ.
• Kernel có thể được thực hiện bởi nhiều khối thread được phân
chia bằng nhau, do đó tổng số thread bằng với số thread trên
một khối nhân với số lượng khối.
• Để chỉ ra khối trong lưới là 1 hay 2 chiều có thể truy cập trong
Add Text
kernel qua biến blockIdx. Chiều của khối thread được truy cập
trong kernel qua biến blockDim.
Phân cấp bộ nhớ
(Memory-level)

• Thread CUDA có thể truy cập dữ liệu từ nhiều không


gian nhớ trong suốt quá trình thực hiện của nó.
• Mỗi thread có một vùng nhớ nội bộ riêng. Mỗi khối
thread có vùng nhớ chia sẻ chúng với tất cả thread
thuộc block đó với các block trong cùng thời gian đó.
• Tất cả các thread có thể truy cập một vùng nhớ chung
gọi là vùng nhớ cục bộ.
• Có những không gian nhớ chỉ có thể đọc bởi tất cả các
thread: vùng nhớ không đổi và vùng nhớ kết cấu.
Add Text
Ngăn xếp phần mềm
(Software Stack)
Ngăn xếp phần mềm CUDA gồm các lớp như hình dưới:
• Driver của thiết bị.
• Giao diện ứng dụng của chương trình (API) thời gian
chạy.
• Hai thư viện toàn học mức cao CUFFT và CUBLAS.

Add Text
Giao diện lập trình
Giao diện lập trình

vMở rộng ngôn ngữ lập trình C

§ Một số các mở rộng từ ngôn ngữ lập trình C cho phép lập trình viên thực hiện một
phần của chương trình trên thiết bị tính toán.
§ Một thư viện được chia ra thành các thành phần:
§ Thành phần chính (host component): chạy trên host và cung cấp các chức năng
để truy cập tới một hoặc nhiều thiết bị khác từ host.
§ Các thiết bị thành phần (device component): chạy trên thiết bị và cũng cấp các
hàm riêng của thiết bị đó.
§ Một thành phần chung (common component): cung cấp các kiểu dữ liệu vector và
các tập con trong thư viện chuẩn của C, nó hỗ trợ cho cả host và thiết bị thành
phần.
Thuật ngữ

CUDA:

Host: Device:
CPU và bộ nhớ của nó (host memory) GPU và bộ nhớ của nó (device memory)
Hạn định của hàm
Trong 1 chương trình, có subprogram thì chạy ở host, có cái thì chạy ở device.
Nên để chỉ định một cách tường minh, các từ khóa (specifier) sau được dùng.

__device__
• Xác định kenel (chạy trên device)
• Chỉ được gọi từ 1 kenel khác
• Không có biến tĩnh (static variable)

__global__
• Chỉ có thể được gọi từ một host function
• Kiểu trả về luôn là void

__host__
• Xác định host function (chạy trên host)
• Chỉ có thể được gọi từ 1 host function khác
Hạn định của biến

__device__
• Chứa trong global memory (device memory).
• Có thời gian sống xác định trong một ứng dụng.
• Có thể được truy cập từ mọi thread ở mọi grid.

__constant__
• Chứa trong vùng nhớ hằng số
• Chỉ có thể được gán giá trị từ host functions

__shared__
• Chứa trong trong block shared memory
• Tồn tại theo block
• Chỉ có thể được truy cập từ các threads của block đó
Hạn chế với kernel

§ Chỉ truy xuất bộ nhớ trên GPU (không được đọc data từ CPU, vì thế trước khi thực thi
kernel, từ host phải thực hiện các tác vụ khởi tạo các đối tượng dữ liệu trên GPU và
sao chép dữ liệu cần thiết từ host memory ra đó.
§ Mỗi function phải có số đối số (arguments) là cố định
§ Không có biễn tĩnh (static)
§ Không có đệ qui
§ kernel phải được khai báo dùng 1 trong các qualifier sau
__global__ : kernel này được gọi từ host (CPU), trả về luôn là void
__device__ : kernel này được gọi từ 1 kernel khác
__host__ : function thực thi trên CPU (mặc định nếu không chỉ định qualifier)
__host__ __device__
Cấu hình thực thi

Cú pháp:

function_name<<<gd, bd [, N]>>>(param1, param2, param3)

function_name là tên hàm cần gọi, param_i là các đối số của nó.
• gd: kích thước của grid (kiểu dim3, với 3 thành phần: gd.x, gd.y, gd.z cho biết
số blocks ở mỗi chiều
§ bd: kích thước của mỗi blocks (kiểu dim3, với 3 thành phần: bd.x, bd.y,
bd.z cho biết số threads ở mỗi chiều
§ N: (optional) cho biết số lượng bộ nhớ (tính theo bytes) cần thêm vào
trong shared memory của mỗi block để dùng cho đối số là assumed-sized
array
Biến định nghĩa sẵn

Để phân chia công việc cho mỗi threads, ta cần xác định các thông tin về threads.
CUDA đã có các biến đặc biệt sẵn để hỗ trợ

gridDim: (kiểu dim3), cho biết kích thước của grid


blockIdx: (kiểu uint3), chứa index của block trong grid
blockDim: (kiểu dim3), cho biết kích thước của blocks
threadIdx: (kiểu uint3), chứa index của thread trong block
Biên dịch với NVCC
Trình biên dịch

Quá trình biên dịch diễn ra qua nhiều giai


đoạn:
1. Code cho CPU và code cho GPU sẽ được
tách ra
2. Code cho GPU sẽ được convert sang một
ngôn ngữ trung gian giống như assembly
language, gọi là PTX (Parallel Thread
eXecution). Tại đây, nó sẽ được kiểm tra
tính tối ưu. Cuối cùng, nó sẽ được chuyển
về dạng mã máy mà GPU có thể hiểu ở
dạng nhị phân.
Biên dịch với NVCC
nvcc là một command-line tool để biên dịch ứng dụng CUDA. Với ngôn ngữ C, nvcc sẽ
gọi gcc và NVIDIA PTX compiler.

§ nvcc <filename>.cu [-o<executable>]


§ Builds release mode
§ nvcc –g<filename>.cu
§ Builds debug mode
§ Can debug host code but not device code
§ nvcc –deviceemu <filename>.cu
§ Builds device emulation mode
§ All code runs on CPU, no debug symbols
§ nvcc –deviceemu –g <filename>.cu
§ Builds debug device emulation mode
§ All code runs on CPU, with debug symbols
§ Phù hợp cho debug chương trình
Biên dịch với NVCC
Ví dụ: HelloCuda.cu
#include <stdio.h>
int main(void){

printf("Hello, Cuda! \n");

return(0);
}

Sử dụng trình biên dịch nvcc:

scc-he1: % nvcc -o helloCuda helloCuda.cu


Biên dịch với NVCC

Ngôn ngữ CUDA tuân thủ chặt chẽ cú pháp C / C ++ với bộ mở rộng tối thiểu:

Function to be executed on the device (GPU) and called


from host code

__device__ void foo(){ . . . }

Trình biên dịch NVCC sẽ biên dịch hàm chạy trên thiết bị và trình biên dịch máy
chủ (gcc) sẽ xử lý tất cả các chức năng khác chạy trên máy chủ (ví dụ: main ())
DEMO
Demo
Demo
Case Study
Case Study
• Dự án Folding@Home
• Đại học Stanford University đang sử dụng một trong những ứng
dụng tính toán phổ biến nhất hiện nay mang tên (FAH), chuyên dùng
để tính toán protein trên diện rộng, sử dụng hàng nghìn máy tính và
máy chơi game PlayStation 3 trên toàn thế giới.
• Ý tưởng ở đây là hiểu rõ hơn cách các protein tự tập hợp, cũng như
một số sai sót trong quá trình này -- được cho là nguyên nhân gây ra
các chứng bệnh như Alzheimer và Parkinson.
Case Study
Case Study
• Hiện tại phòng thí nghiệm Đại học Stanford đang phối hợp với ATI
để sản xuất ra một phiên bản tăng tốc GPU dành cho phần mềm này
của họ. Thế hệ thứ hai của ứng dụng này đã có bản beta miễn phí,
và đang sử dụng CUDA đối với GPU Nvidia, hoặc CAL đối với card
ATI.
• Theo trang web thì khi bài báo này đang được viết, có khoảng 7600
GPU đang chạy ứng dụng FAH, tạo ra 840 teraflop năng lượng tính
toán (đây không phải là một con số mang tính lý thuyết, mà là số
năng lượng thực dùng để chạy các phép tính trong FAH), tức là
trung bình khoảng 110 gigaflop mỗi GPU.
Case Study
• Ở thời điểm đó,PS3 vẫn đang dẫn đầu với tổng cộng 1,358 teraflop,
nhưng đó là từ hơn 48,000 PS3 đang hoạt động. Mỗi PS3 tạo ra
khoảng 28 gigaflop.
• Nói cách khác, một máy trạm GPU trung bình nhanh hơn 4 lần so
với PS3, tính cả card đồ hoạ cũ và giá rẻ. Còn các loại card mới có
tốc độ gấp từ 4 đến 6 lần.
Case Study
• Ở thời điểm đó,PS3 vẫn đang dẫn đầu với tổng cộng 1,358 teraflop,
nhưng đó là từ hơn 48,000 PS3 đang hoạt động. Mỗi PS3 tạo ra
khoảng 28 gigaflop.
• Nói cách khác, một máy trạm GPU trung bình nhanh hơn 4 lần so
với PS3, tính cả card đồ hoạ cũ và giá rẻ. Còn các loại card mới có
tốc độ gấp từ 4 đến 6 lần.
Case Study
• Dự án hiện tại của Folding@Home là CovidMoonshoot cũng dựa
trên sức mạnh GPU nhằm đánh giá hàng nghìn phân tử mỗi tuần,
tổng hợp hàng trăm phân tử này trong nhiệm vụ phát triển một loại
thuốc không có bằng sáng chế cho COVID-19 có thể được dùng
như một viên thuốc đơn giản 2 lần / ngày.
Case Study
Đối với các dòng GPU bình thường, sẽ giúp tăng tốc từ 15-30% tốc
độ xử lý phân tích trên GPU
Case Study
Kết hợp với Nvidia, dự án này đã sử dụng them 1 công nghệ đặc biệt
là OpenMM giúp xác định các phương pháp trị liệu đầy hứa hẹn —
dao động từ 50-400%
TÓM TẮT
TÓM TẮT
• GPU đã trở thành phương tiện được ưu tiên để đào tạo các mô hình AI
• GPU cung cấp tốc độ ấn tượng so với CPU, khi khối lượng công việc đủ lớn
và dễ dàng chạy song song.
• GPU khác nhau nhằm tối ưu cho các mục đích về AI và Deep Learning.
• Các công nghệ GPU và công nghệ xung quanh GPU như NVIDIA Tesla,
NVLINK, NVSWITCH… nhằm tăng tốc AI đã phát triển mạnh mẽ.
THANK YOU !

You might also like