---
tags: Multi-threading in Java
---
# 012: Sự thật về **Hyper-threading**
Bài viết nằm trong series [Multithread từ hardware tới software với Java](https://hackmd.io/@datbv/r1uoC54Kd).
Chúng ta đã rất quen thuộc với Intel Core i5 4 cores 4 threads, i5 4 cores 8 threads có công nghệ **Hyper-threading**. Vậy **hyper-threading** là gì, 4 cores 8 threads là sao?
Bài viết này chỉ có duy nhất mục đích đó là giải thích về **hyper-threading**.
Có 2 loại **thread** chúng ta cần quan tâm và phân biệt:
> - **CPU thread**: là thread trong Interl Core i5 4 cores 4 threads. Nó mang ý nghĩa luồng thực thi của CPU. Mỗi một processor (core) chỉ có khả năng xử lý duy nhất 1 luồng (thread).
> - **OS thread**: là thread trong lập trình **multi-thread**. Là thread trong một process. Với các lập trình viên, khi nói đến **thread**, ta hiểu nó là **OS thread**.
Ở bài trước, ta đã biết 1 **processor** (core) của CPU chỉ thực thi duy nhất **1 thread** tại một thời điểm. Và CPU sẽ bao gồm nhiều processor bên trong, ví dụ Intel Core i5 4 cores 4 threads, 4 threads này tương ứng mỗi processor xử lý duy nhất 1 CPU thread. Các **OS thread** sẽ được đẩy vào **CPU thread** này để được thực thi.
Tuy nhiên, bạn sẽ bắt gặp một vài CPU Intel Core i5 4 cores 8 threads. Mỗi nhân vật lý (processor) thực thi như 2 nhân ảo, có thể xử lý được 2 luồng một lúc, sức mạnh ngang ngửa 8 cores vật lý mà lại rẻ hơn. Cái này là seller quảng cáo như vậy :joy:.
Theo google, **Hyper-threading** là công nghệ siêu phân luồng do Intel phát minh, cho phép chạy đồng thời 2 luồng cùng lúc trên một processor.
Hàng ảo mà ngang ngửa hàng thật. Sự thật phía sau là gì?
Về mặt bản chất, **hyper-threading** là tận dụng tối đa khoảng thời gian trống của **processor** khi một thread bị ngừng thực thi (vì một vài lý do), từ đó tối ưu khả năng xử lý. **Đa số** các trường hợp thread ngừng thực thi có **2 nguyên nhân chính**:
> - Context switch.
> - Cache coherency.
Chúng ta đã biết **context switch** ở bài trước, xảy ra khi 2 thread đổi chỗ cho nhau để được thực thi trên processor. Trong quá trình đổi chỗ đó, **processor** được giải phóng và không làm gì **(1)**. Synchronize dẫn đến **context switch**, I/O blocking dẫn đến **switch context**...
Tiếp theo là vấn đề **cache coherency**. OS sẽ copy value/instruction từ **RAM** lên **processor register** để **processor** thực thi. Tuy nhiên, có thể xảy ra hiện tượng **cache miss** do value/instruction đó không còn tồn tại. Nguyên nhân dung lượng của **register** rất nhỏ, nếu value/instruction đó chưa được thực thi ngay nó sẽ bị xóa ra khỏi bộ nhớ. Do đó, đến thời điểm thực thi thật sự, **register** phải copy lại value/instruction từ **RAM**. Trong quá trình đó, **processor** được giải phóng và không làm gì **(2)**.
> **Hyper-threading** ra đời nhằm tận dụng khoảng thời gian chết đó **(1) và (2)**, nhằm tối đa hóa công suất và thời gian làm việc của **processor**.
Ngoài ra với **hyper-threading**, mỗi **processor** có 2 **set of registers (bộ thanh ghi)** và có thể thực hiện các instruction từ **2 thread**, tuy nhiên tại 1 thời điểm chỉ thực thi duy nhất 1 **thread**. Do đó nó được gọi là **2 cores 4 threads/4 cores 8 threads** (số lượng threads gấp đôi số cores). Và khi **(1) hoặc (2)** xảy ra, nó sẽ switch sang **set of registers** còn lại và xử lý với tốc độ cực nhanh, không tốn thời gian như **context switch**.
Do vậy, CPU 4 cores 8 threads vẫn không thể so sánh với CPU 8 cores 8 threads. Tuy nhiên tốc độ xử lý của nó tốt hơn CPU 4 cores 4 threads, phụ thuộc vào tần suất các vấn đề **cache miss** hay **context switch** xảy ra, rơi vào khoảng 30% (được các kĩ sư mạng tính toán).
Một nửa sự thật, vẫn là sự thật. CPU có hyper-threading sẽ nhanh hơn, đồng thời tốn điện hơn, tuy nhiên không thể bằng hàng thật.
### Reference
- https://hackmd.io/@datbv/r1uoC54Kd#Reference
© [Dat Bui](https://www.linkedin.com/in/datbv/)