Tìm hiểu công nghệ siêu phân luồng (SMT) - Ý nghĩa và lợi ích
Hyper-Threading Technology (HTT) hay Simultaneous multithreading (SMT) là một kỹ thuật xử lý công việc tồn tại hơn 2 thập kỷ qua trên các chip Intel, nay đã bị công ty này loại bỏ. Nó là gì và có lợi ích thế nào, hãy cùng tìm hiểu.
Nếu là người chơi PC lâu năm, hẳn bạn không lạ lùng gì với cụm từ "siêu phân luồng" được Intel ra rả quảng bá khắp nơi, như là một công nghệ siêu việt, mà nếu con chip của bạn không có, thì sẽ có cảm giác... có gì đó "thua chị kém em". Dĩ nhiên cảm giác này chủ yếu đánh vô tâm lý những ai có ý định mua chip của AMD trước khi Zen ra đời. Đó là vì trước khi AMD ra mắt Zen thì công ty này quyết tâm nói KHÔNG với HTT/SMT.
Nhưng cuộc sống đôi khi có những chuyện không thể ngờ. AMD từ sau Zen đã có SMT. Và Intel mới đây nhất, trên Lunar Lake, đã quyết định bỏ "công nghệ siêu việt" này. Như vậy SMT "tốt hay không tốt", "có cần thiết hay không"? Chúng ta hãy cùng phân tích chủ đề này.
Nội dung bài viết
SMT là gì, ra đời trong hoàn cảnh nào?
SMT hay viết cho đầy đủ là xử lý đa luồng cùng lúc, là một kỹ thuật cho phép một nhân xử lý vật lý siêu vô hướng (superscalar) có thể xử lý cùng lúc nhiều luồng dữ liệu khác nhau, mà không cần phải tốn quá nhiều tài nguyên (silicon). Trên thực tế, tuỳ theo bản chất thiết kế chip, số luồng xử lý có thể từ 2 cho tới 4 hoặc 8 luồng. Con số phổ biến hiện nay là 2 luồng (SMT-2).
Về mặt lịch sử mà nói, tuy Intel là công ty quảng bá SMT nhiều nhất, song họ lại không phải đơn vị đầu tiên phát minh ra nó. Mà đó là IBM, từ những năm cuối thập niên 60 thế kỷ trước. SMT đi liền với cái tên Dean Tullsen, khi nó được phát triển cùng với con chip Alpha 21464 của hãng DEC. Đáng tiếc là DEC sau đó bị Compaq mua lại - đây là một trong những sự kiện mua bán doanh nghiệp công nghệ nổi tiếng nhất thập niên 90. Nhưng khôi hài là Compaq về sau lại bị HP mua lại. "Số phận long đong" của Alpha 21464 bị chốt sổ sau lần hợp nhất cuối này. Công trình của Dean sau cùng về dưới trướng của Intel, trong hình hài con chip Pentium 4 (đơn nhân) huyền thoại.
Chip SPARC T4 có 8 nhân nhưng hỗ trợ xử lý tới 64 luồng
Trên thực tế ngoài Intel ra, IBM và Sun Microsystems (bị Oracle mua lại) cũng có các sản phẩm ứng dụng SMT, tiêu biểu như POWER hay UltraSPARC. Cá biệt như Sun UltraSPARC T3 hỗ trợ tới 16 luồng (SMT-16)! Dù vậy thiết kế siêu-siêu phân luồng này có vẻ không hiệu quả nên các thế hệ SPARC cả trước và sau đó đều dừng lại ở mức 8 luồng (SMT-8). Việc có nhiều "đại gia" cùng ứng dụng SMT như thế trong thập niên 2000 khiến cho nhiều người cảm thấy AMD không có SMT dường như là sự thiệt thòi. Song chuyển qua thập niên 2010 cũng như 2020 hiện tại, phe ARM (Apple, Qualcomm, Samsung, MediaTek...) vẫn có thể làm ra những con chip mạnh mẽ mà không cần tới SMT.
Điều này dẫn tới một câu hỏi là chúng ta có thực sự cần SMT để có một con chip tốt?
Bản chất của SMT
Nhưng trước khi bàn SMT "cần" hay "không cần", chúng ta cần hiểu rõ lý do tại sao các kỹ sư máy tính đã nghĩ ra chúng và lợi ích cũng như khó khăn trở ngại của SMT.
Tại sao lại có SMT? Hãy tưởng tượng bạn là chủ một quán ăn, với một mặt bằng có thể phục vụ tối đa một chục khách. Thực đơn thì đa dạng có cả chiên xào kho luộc nướng... Trong đó mỗi món có đặc trưng riêng và thời gian chế biến bình quân 5-6 công đoạn, mỗi công đoạn yêu cầu thời gian dài ngắn khác nhau. Trong điều kiện lý tưởng nếu chỉ có 1 khách gọi 1 món, thì đầu bếp của bạn chỉ cần thực hiện tuần tự các công đoạn cho tới khi hoàn thành món đó là xong.
Nếu lượng order ít thì 1 đầu bếp hoàn toàn xử lý được
Song trên thực tế, có lúc quán đông khách và thưa khách, điều kiện lý tưởng không phải lúc nào cũng có, thường khách sẽ gọi 3-4 món khác nhau. Dĩ nhiên đầu bếp vẫn có thể làm tuần tự từng món một để đảm bảo độ chỉn chu, tỉ mẩn (nếu cần), nhưng cơ bản là tổng thời gian nấu sẽ rất lâu, và khách sẽ không vui cho lắm. Vì thế để "suôn sẻ hơn", đầu bếp có thể chia các công đoạn ra xen kẽ nhau, ví dụ nếu món A cần hầm hay luộc thì đầu bếp có thể băm cắt xả món B, ướp gia vị món C chẳng hạn. Cách làm cùng lúc như thế này sẽ tiết kiệm đáng kể thời gian, nhưng đòi hỏi đầu bếp/phụ bếp phải nhớ rõ từng món đang làm gì, chờ trong bao lâu, vân vân và mây mây.
Ngoài ra trong trường hợp order của khách quá đông, sẽ dễ xảy ra việc nhầm lẫn. Ai đó yêu cầu phần ăn này không hành, người khác đòi không cay... Đôi khi bạn sẽ cần có thêm vài đầu bếp để xoay sở cùng lúc nếu không muốn bị khách đánh giá 1-2 sao vì chế biến không đúng ý họ.
Nhưng có cả chục khách cùng order lại là chuyện khác
Và đó là lý thuyết của xử lý đa luồng (multithreaded). Nếu chỉ có 1 đầu bếp nhưng phải làm 3-4 món cùng lúc, chúng ta gọi là SMT. Còn khi có nhiều đầu bếp nấu ăn cùng lúc, chúng ta gọi là CMP (chip multiprocessing) hay đa nhân (multicore). Nhưng nhiều nhân thì xử lý được nhiều luồng cùng lúc là quá hiển nhiên nên gần như không cần nhắc tới. Khác biệt giữa SMT vs. CMP chắc bạn cũng tự nhìn ra được. Song ở điều kiện nào mới có thể áp dụng SMT?
Quay lại ví dụ quán ăn, trước hết để có thể làm nhiều món cùng lúc, điều kiện tiên quyết là bạn phải có thật nhiều nồi niêu xoong chảo. Không gian bếp của bạn cũng phải đủ rộng rãi để có thể chứa được nhiều nguyên liệu thô cũng như đang sơ chế/chế dang dở/hoàn thành. Bạn cũng cần có nhiều hơn 1 cái bếp nếu muốn nấu cùng lúc nhiều món. Ngoài ra, bạn cần một BỘ NHỚ TỐT để biết món A đang ở bước nào, B ở bước nào, C bước nào. Vì nếu không bạn sẽ rơi vô cảnh trên chín dưới khê tứ bề nhão nhoét, canh mặn, cá ươn, thịt chảy nước và... chắc bạn cũng tự hiểu...
Vậy một thiết kế chip SMT ngoài việc đảm bảo xử lý được một luồng cơ bản, nó còn yêu cầu phải có thêm thật nhiều thanh ghi (register file - 1 dạng bộ nhớ để lưu tạm dữ liệu thô/sơ chế/hoàn chỉnh) để khi một luồng xử lý bị treo (stall) do đang chờ lấy dữ liệu từ nơi khác về (thường mất nhiều chu kỳ - cycle), thì nó có thể "nhảy" qua luồng khác và xử lý tiếp. Trong một số trường hợp, nó còn cần có thêm ALU/AGU hoặc các thành phần chức năng khác để xử lý cùng lúc nhiều luồng. Không chỉ thế, scheduler của con chip cũng phải nắm rõ luồng nào đang chạy ở ALU/AGU nào, lưu dữ liệu vô thanh ghi nào, quá trình xử lý đã tới giai đoạn nào, có xuất kết quả ra L1/L2 Cache hay chưa...
Triết lý đa luồng của AMD Bulldozer gồm 2 nhân INT cho 2 luồng
Nói cách khác, tuy chỉ là 1 nhân xử lý nhưng để áp dụng được SMT, những tài nguyên cần có thêm cũng tăng thêm không ít. Đây cũng chính là nguyên nhân mà AMD (trước thời Zen) nhất quyết nói KHÔNG với SMT. Vì logic của kỹ sư AMD lúc bấy giờ là chỉ cần thêm 15-20% silicon (so với 1 nhân INT hỗ trợ SMT) là có được 2 nhân INT, vậy tại sao phải "đâm đầu" vô SMT làm gì? Và khôi hài thay, Intel sau hơn 2 thập kỷ gắn bó với SMT, tới Lunar Lake và Panther Lake cũng nói rằng bỏ SMT sẽ tiết kiệm 10-15% diện tích nhân xử lý. Vậy hỗ trợ SMT hay không, vấn đề thực chất nằm ở mục đích thiết kế của nhà sản xuất, chứ không phải việc bắt buộc.
"Đào sâu" vấn đề xử lý đa luồng
Ở trên chúng ta nói "đơn giản" vấn đề cho dễ hình dung. Ở đây sẽ nặng "học thuật", nên bạn có thể đọc hoặc không tuỳ hỉ. Chúng ta sẽ nói sâu xa "nguồn cội" của xử lý đa luồng.
Trên thực tế điều gì làm nên sức mạnh của một con chip? Nói dông nói dài thì rất nhiều nhưng phần lớn cô đọng ở chỗ mỗi giây nó xử lý được bao nhiêu công việc (bản chất của benchmark). Một thang đo tuy gọi là rập khuôn nhưng vẫn áp dụng đúng cho đa số trường hợp là hệ số IPC (số tập lệnh xử lý trong một chu kỳ). Mà để có thể giải quyết được nhiều thứ cùng lúc thì chỉ có cách là xử lý song song (parallel), điều này đúng cho cả GPU, NPU, ASIC...
Một kiến trúc tốt là kiến trúc xử lý được nhiều công việc hơn trong cùng khoảng thời gian
Nhưng song song là song song cái gì? Có 2 dạng xử lý song song trên CPU - (1) song song cấp độ tập lệnh (ILP), (2) song song cấp độ luồng (TLP). Về bản chất, tập lệnh nhỏ hơn luồng. Một luồng dữ liệu có thể chứa nhiều tập lệnh cần xử lý. Nói cho dễ hình dung, luồng dữ liệu là một món ăn, tập lệnh là những gì nằm trong món ăn. Ở dạng (1), chúng ta "chẻ" món ăn ra nhiều thành phần con, xử lý từng phần để sau cùng ra được món ăn. Ở dạng (2), chúng ta chế biến nhiều món ăn cùng lúc, có thể là luân phiên, xen kẽ hay tuần tự. Tất nhiên, dù là (1) hay (2) thì bản chất sau cùng vẫn là làm ra cái món để mà ăn.
Một thiết kế "nặng" ILP thường sẽ là thiết kế không có SMT, trong đó nhân xử lý chỉ quan tâm 1 luồng dữ liệu duy nhất, chỉ khi nào xử lý xong luồng đó thì nó mới nhận tới luồng khác để chạy tiếp. Nhưng vì đặc trưng này, nếu luồng dữ liệu bị treo do tiên đoán rẽ nhánh sai, dữ liệu nằm "quá xa"... thì nhân xử lý cơ bản là... chả làm gì cả. Mà con chip không làm việc thì tất nhiên IPC của nó sẽ thấp (gọi nôm là năng suất kém). Vì lẽ đó, các kỹ sư máy tính ở thế kỷ trước mới nghĩ tới TLP như một cách để cải thiện IPC - thay vì chỉ xử lý 1 luồng cho xong, nay nhân xử lý có thể chạy được nhiều luồng.
Nhưng đa luồng không có nghĩa đã là SMT, mà SMT chỉ là 1 trong 4 dạng đa luồng. Chúng bao gồm fine-grained (bào mịn), coarse-grained (bào thô), simultaneous (SMT) và multicore (CMP). Ở fine-grained, mỗi chu kỳ nhân xử lý chỉ chạy một phần nào đó của luồng dữ liệu. Nếu có 4 luồng dữ liệu thì sau 4 chu kỳ, nhân xử lý sẽ quay lại luồng ban đầu để chạy tiếp và cứ thế (luồng nào đã xử lý xong thì thôi). Ở coarse-grained, thực tế nó gần hệt như dạng (1), khác biệt ở chỗ khi luồng ABC nào đó bị treo thì nhân xử lý sẽ chuyển sang luồng kế tiếp, xử lý cho tới khi luồng mới xong/treo thì lại chuyển sang luồng khác.
Hình thái xử lý đơn luồng (trái) vs. 4 hình thái xử lý đa luồng
Ở SMT thì chúng ta đã nói ở trên, ví dụ nhân xử lý được 4 luồng cùng lúc (SMT-4) thì cả 4 luồng sẽ cùng được nạp vào nhân xử lý, nhưng tuỳ số tài nguyên "thừa" có sẵn mà thực tế ở mỗi chu kỳ, có bao nhiêu tập lệnh được xử lý. Tất nhiên nhìn "từ trên cao" thì hệ điều hành sẽ "thấy" nhân này đang chạy 4 luồng. Có điều với tốc độ xử lý vài tỷ chu kỳ/giây (GHz) - 1 chu kỳ tính bằng picosecond, thực tế "người trần mắt thịt" như chúng ta sẽ không phân biệt được.
Hình thức TLP cuối cùng chính là đa nhân - mỗi nhân "ôm" một luồng. Về căn bản nó y hệt dạng (1) trừ việc số 1 mà nhân với bất kỳ số nào cũng sẽ thành số đó, 4 nhân thì 4 luồng, 16 nhân 16 luồng, dễ như toán cấp 1.
Kiến trúc Zen của AMD với các thành phần hỗ trợ SMT
Cuối cùng, thực tế con chip là SMT hay CMP đều không quan trọng. Quan trọng cả 2 đều cùng là xử lý đa luồng và quan trọng hơn là ở mỗi chu kỳ, con chip đó chạy được bao nhiêu tập lệnh. Trên thực tế, đôi khi ứng dụng SMT có thể gây ra sụt giảm hiệu năng do tình trạng "loạn" dữ liệu. Việc chuyển qua chuyển lại giữa 2 luồng dữ liệu khác nhau trong vài trường hợp làm tăng thêm độ trễ vì bộ tiên đoán rẽ nhánh phải reset lại, dữ liệu tạo ra vượt quá dung lượng thanh ghi cục bộ và phải chuyển sang nơi khác, khi cần nạp lại cho luồng cũ mất thêm thời gian để copy, vân vân và mây mây.
Vai trò lịch sử
Việc các kỹ sư máy tính nghĩ tới SMT từ thời Chiến tranh Lạnh cho thấy một vấn đề có tính lịch sử hơn là yêu cầu bắt buộc của công nghệ. Mặc dù hôm nay chúng ta phân biệt rõ ràng nhân xử lý vs. chip máy tính, nhưng cách đây 60-70 năm, 2 khái niệm này là 1. Hoặc đúng hơn, ở thế hệ ông bà của chúng ta, chip máy tính thuần tuý chỉ có duy nhất 1 nhân xử lý. Điều này có nghĩa năng lực xử lý dữ liệu của chip máy tính thế kỷ trước gặp rất nhiều hạn chế. Chỉ có 1 nhân đồng nghĩa với tại 1 thời điểm, con chip (hoặc cả chiếc máy tính nếu là cấu hình 1P) chỉ làm được 1 việc duy nhất. Thế nên các kỹ sư đã nghĩ ra nhiều cách TLP kể trên để con chip có thể làm được nhiều việc hơn.
Cần nhắc lại ít nhất tới 2004, khi Intel ra mắt con chip 2 nhân (dual-core) Pentium D đầu tiên, hầu hết mọi chiếc PC chỉ có duy nhất 1 nhân xử lý. Và khi chiếc máy tính đang "bận rộn" làm việc gì đó, nếu chúng ta không đủ kiên nhẫn mà mở ngay ứng dụng/chương trình khác, khả năng không nhỏ là màn hình xanh Ctrl+Alt+Del sẽ xuất hiện lù lù! Nhưng hôm nay, nhờ định luật Moore mà chúng ta đã được "giải thoát" phần nào. Bạn có thể vừa encode phim, vừa gõ Word, lại nghe Youtube, đồng thời mở game MMO cày auto ở chế độ background... Tất cả là nhờ những con chip 4 nhân, 8 nhân, 16 nhân... Điều này chắc chắn là không thể với những con chip 1 nhân từ thế kỷ trước.
Trên môi trường PC, lợi ích SMT mang lại không thể hiện rõ rệt
Và như các kỹ sư AMD từng nói, nhân "thực" vẫn tốt hơn nhân "ảo". Điều này không có gì phải bàn cãi. Có 2 đầu bếp cùng làm 2 món độc lập thì chả hơn chỉ 1 đầu bếp vừa băm hành, vừa bóc tỏi, vừa luộc trứng, vừa thái rau? 4 đầu bếp lại càng thoải mái hơn! Dĩ nhiên, điều kiện tiên quyết là con chip của bạn phải có thật nhiều nhân, chứ không phải chỉ duy nhất 1 nhân thì SMT hay không SMT cũng đều... gục ngã. Nhưng nhiều nhân cũng có nghĩa là tốn nhiều silicon hơn, tức tốn chi phí sản xuất hơn. Thuê nhiều đầu bếp hơn thì tốn tiền hơn.
Tất nhiên, cũng không thể bỏ qua dòng chip server, vốn có nhiều nhân hơn chip PC. Dù vậy, các ứng dụng server mang tính chuyên sâu hơn, cũng như ôm đồm nhiều việc hơn PC. Và quan trọng hơn là chip server thường phải có liên kết Internet, vốn sẽ tốn nhiều thời gian delay hơn để nhận dữ liệu từ phía người dùng. Độ "lag" 300-500 ms có lẽ không nhiều với chúng ta nhưng là hàng triệu chu kỳ với một con chip hiện đại. Do đó, SMT vẫn có ý nghĩa thiết thực với phân khúc chip này.
Server là môi trường SMT có ưu thế rõ
Nói đến đây, hẳn bạn cũng hình dung được vào thời điểm 2024 này, có SMT hay không hoàn toàn tuỳ thuộc ý muốn của nhà sản xuất. Nó không nói lên sự ưu việt nào trong kỷ nguyên chip đa nhân, mà 4 nhân đã trở thành tiêu chuẩn và ít năm nữa sẽ là 8 nhân. Dĩ nhiên mình không phủ nhận SMT trong quá khứ là một hướng đi tốt. Song nó là một giải pháp thuộc mang tính thời cuộc, mà mỗi thời sẽ có những ưu nhược của mình. Sau chót, vẫn là kiến trúc nào có hệ số IPC cao hơn chứ không phải là số luồng hiển thị trên Task Manager...
