You are on page 1of 12

A Modern Multi-Core Processor ( Bộ xử lý lõi hiện đại )

Phần 1: Thực hiện song song.


-Ví dụ minh họa:
Tính sin (x) bằng khai triển Taylor: sin (x) = x - x3 / 3! + x5 / 5! - x7 / 7! + ... cho mỗi
phần tử của một mảng gồm N số điểm định dạng:
void sinx(int N, int terms, float* x, float* result)
{
for (int i=0; i<N; i++)
{
float value = x[i];
float numer = x[i] * x[i] * x[i];
int denom = 6; // 3!
int sign = -1;

for (int j=1; j<=terms; j++)


{
value += sign * numer / denom;
numer *= x[i] * x[i];
denom *= (2*j+2) * (2*j+3);
sign *= -1;
}

result[i] = value;
}
}

Biên dịch chương trình:


float value = x[i];
float numer = x[i] * x[i] * x[i];
int denom = 6; // 3!
int sign = -1;

for (int j=1; j<=terms; j++)


{
value += sign * numer /
denom;
numer *= x[i] * x[i];
denom *= (2*j+2) * (2*j+3);
sign *= -1;
}

result[i] = value;
Thực thi chương trình:
Bộ xử lý rất đơn giản: Thực hiện một lệnh trên mỗi xung nhịp.

Tìm về/
Giải mã

ALU
(Thực thi)

Bối cảnh thực thi

Bộ xử lý siêu cấp
-Hướng dẫn mức song song (ILP).
-Giải mã và thực hiện hai lệnh trên mỗi xung nhịp(nếu có thể).
Bộ Xử Lý: Kỷ nguyên đa lõi trước.
-Phần lớn chip bán dẫn được sử dụng để thực hiện các hoạt động giúp một luồng lệnh
chạy nhanh.

Tìm về\
Giải mã Bộ nhớ đệm dữ liệu
( lớn)

ALU
(Thi hành) Logic điều khiển không theo thứ tự

Công cụ dự đoán nhánh đặc biệt


Bối cảnh thực thi

Trình tải trước bộ nhớ

-Nhiều bóng bán dẫn hơn = bộ nhớ đệm lớn hơn, logic không theo thứ tự thông minh hơn, bộ dự đoán nhánh
thông minh hơn, v.v.
(Ngoài ra: nhiều bóng bán dẫn hơn → bóng bán dẫn nhỏ hơn → tần số xung nhịp cao hơn)

*Bộ xử lý: kỷ nguyên đa lõi

Tìm về/
Giải mã
Ý tưởng #1:
ALU Sử dụng tăng số lượng bóng bán dẫn để thêm nhiều
lõi cho (Thực thi) bộ xử lý.
Thay vì sử dụng bóng bán
độ tinh vi cúa logic bộ xử
giúp tăng tốc một luồng lệnh đơn lẻ ( ví dụ : hoạt động không theo
thứ tự và suy đoán.
Bối cảnh thực thi
Hai lõi: tính toán song song hai phần tử.
Các lõi đơn giản hơn: Mỗi lõi chạy chậm hơn một luồng lệnh so với lõi “ ưa thích” ban đầu của chúng (ví dụ
chậm hơn 25%).
Nhưng bây giờ có hai lõi: 2 × 0,75 = 1,5 (khả năng tăng tốc!).

Chương trình này, được biên dịch bằng gcc


sẽ chạy dưới dạng một chuỗi trên một trong số
các lõi của bộ xử lý.
Nếu mỗi bộ xử lý đơn giản hơn
lõi chậm hơn 25% so với
đơn ban đầu phức tạp,
chương trình của chúng tôi hiện đã chạy chậm hơn
25%.

* Thể hiện song song bằng cách sử dụng pthreads.


* Biểu thức song song dữ liệu
-Các lần lặp vòng lặp được khai báo bởi
lập trình viên độc lập.

-Với thông tin này, bạn có thể hình dung


làm thế nào một trình biên dịch có thể tự
động tạo mã luồng song song.

*Bốn lõi: tính toán bốn phần tử song song

* Mười sáu lõi: tính toán song song mười sáu phần tử.
*Ví dụ về đa lõi

Intel “Skylake” Core i7 quad-core CPU GPU NVIDIA GTX 980 16 lõi xử lý tái
tạo (“SM”) (2014)
(2015)

Intel Xeon Phi “Knights Landing “ 76-core Apple A9 dual-core CPU


CPU
(2015)
(2015)
*Biểu thức song song dữ liệu
Một thuộc tính thú vị khác của mã này:
- Tính song song là qua các lần lặp lại của vòng lặp.
- Tất cả các lần lặp lại của vòng lặp đều làm điều tương tự: đánh giá sin của một số đầu vào duy
nhất
- Trình biên dịch hiểu rằng các phép lặp vòng lặp là độc lập và cùng một phần thân vòng lặp đó sẽ
được thực thi trên một số lượng lớn các phần tử dữ liệu.
- Tính trừu tượng tạo điều kiện tự động tạo ra cả mã song song đa lõi và hướng dẫn vectơ để tận
dụng khả năng xử lý SIMD trong lõi.
*Thêm ALU để tăng khả năng tính toán:

Ý tưởng số 2:
Phân bổ chi phí / mức độ phức tạp của việc quản luồng hướng dẫn trên nhiều ALU.
Xử lý SIMD:
- Một lệnh duy nhất, nhiều dữ liệu.
- Phát hướng dẫn giống nhau cho tất cả các ALU.
- Thực hiện song song trên tất cả các ALU.
Nhớ lại chương trình đã biên dịch ban đầu:
- Luồng lệnh xử lý một phần tử mảng tại một thời điểm bằng cách sử dụng các lệnh vô hướng trên
thanh ghi vô hướng (ví dụ: foats 32 bit).
Chương trình vô hướng:
-Xử lý một phần tử mảng bằng cách sử dụng hướng dẫn vô hướng trên thanh ghi vô hướng (ví dụ:
foats 32 bit)
Chương trình vectơ (sử dụng bản chất AVX):
- Xử lý đồng thời tám phần tử mảng bằng cách sử dụng hướng dẫn vectơ trên thanh ghi vectơ 256-
bit.
Thuật ngữ:
* Tính mạch lạc của luồng hướng dẫn (“thực thi mạch lạc”):
- Trình tự hướng dẫn giống nhau áp dụng cho tất cả các phần tử hoạt động đồng thời.
- Thực thi mạch lạc là cần thiết để sử dụng hiệu quả các tài nguyên xử lý SIMD.
- Việc thực thi mạch lạc KHÔNG cần thiết để song song hiệu quả giữa các lõi, vì mỗi lõi có khả
năng tìm nạp / giải mã một luồng lệnh khác nhau.
Thực hiện “ phân kỳ”:
- Thiếu sự mạch lạc của luồng hướng dẫn.
Thực thi SIMD trên các CPU hiện đại:
▪ Hướng dẫn SSE: Hoạt động 128 bit: 4x32 bit hoặc 2x64 bit (vectơ foat 4 rộng).
▪ Hướng dẫn AVX: hoạt động 256 bit: 8x32 bit hoặc 4x64 bit (vectơ foat 8 rộng).
▪ Hướng dẫn được tạo bởi trình biên dịch:
- Song song được yêu cầu rõ ràng bởi lập trình viên bằng cách sử dụng bản chất.
- Song song được truyền đạt bằng cách sử dụng ngữ nghĩa ngôn ngữ song song (ví dụ: ví dụ về
forall)
- Tính song song được suy ra bởi phân tích sự phụ thuộc của các vòng lặp (vấn đề khó, ngay cả
những trình biên dịch tốt nhất cũng không hoàn hảo trên mã C / C ++ tùy ý).
▪ Thuật ngữ: “SIMD rõ ràng”: Song song SIMD được thực hiện tại thời điểm biên dịch:
- Có thể kiểm tra nhị phân chương trình và xem hướng dẫn (vstoreps, vmulps, v.v.).
▪ “SIMD ngầm”:
- Trình biên dịch tạo ra một nhị phân vô hướng (hướng dẫn vô hướng).
- Nhưng N phiên bản của chương trình * luôn chạy * cùng nhau trên bộ xử lý
thực thi (chức năng của tôi, N) // thực thi chức năng của tôi N lần.
- Nói cách khác, bản thân giao diện với phần cứng là dữ liệu song song.
- Phần cứng (không phải trình biên dịch) chịu trách nhiệm thực hiện đồng thời cùng một lệnh từ
nhiều trường hợp trên dữ liệu khác nhau trên SIMD ALUs.
▪ Chiều rộng SIMD của hầu hết các GPU hiện đại nằm trong khoảng từ 8 đến 32:
- Sự khác biệt có thể là một vấn đề lớn (mã được viết kém có thể thực thi ở 1/32 khả năng cao
nhất của máy!).
Ví dụ:
Intel Core i7.(4 lõi, 8SIMD ALU cho mỗi lõi).
NVIDIA GTX 480(15 lõi ,32 SIMD ALU cho mỗi lõi ,1.3 TFLOPS).
Tóm tắt: thực hiện song song:
▪ Một số hình thức thực hiện song song trong các bộ vi xử lý hiện đại:
- Đa lõi: sử dụng nhiều lõi xử lý.
- Cung cấp song song mức luồng: thực hiện đồng thời một luồng lệnh hoàn toàn khác nhau trên
mỗi lõi.
- Phần mềm quyết định thời điểm tạo chuỗi (ví dụ: thông qua API pthreads).
- SIMD: sử dụng nhiều ALU được điều khiển bởi cùng một dòng lệnh (trong một lõi).
- Thiết kế hiệu quả cho khối lượng công việc song song dữ liệu: kiểm soát phân bổ trên nhiều
ALU.
- Vectơ hóa có thể được thực hiện bằng trình biên dịch (SIMD rõ ràng) hoặc trong thời gian chạy
bằng phần cứng.
- [Thiếu] các phụ thuộc được biết trước khi thực thi (thường được khai báo bởi lập trình viên,
nhưng có thể được suy ra bằng phân tích vòng lặp bởi trình biên dịch nâng cao).
- Superscalar: khai thác ILP trong một luồng lệnh. Xử lý các hướng dẫn khác từ cùng một dòng
lệnh song song (trong một lõi).
- Song song tự động và động được phần cứng phát hiện trong quá trình thực thi (không thể nhìn
thấy lập trình viên).

You might also like