Simultaneous Multithreading là gì

Ở bài viết này, mình muốn cùng các bạn tìm hiểu và làm rõ hơn khái niệm vềnhân[core] vàluồng[thread] trong khoa học máy tính, và đi tìm câu trả lời cho các câu hỏi hay gặp suốt ngày trên các mạng xã hội, diễn đàn công nghệ như:

  • Core và Thread khác nhau ở chỗ nào?
  • Có phải CPU có 1 core tức là chỉ chạy được một phần mềm/một thread một thời điểm mà không làm được việc gì khác?
  • Có phải CPU càng nhiều core thì càng mạnh?

Khái niệm về Core [nhân] hết sức dễ hiểu. Mỗi nhân là từng đơn vị xử lý của chiếc vi xử lý, có khả năng độc lập xử lý một dãy các chỉ dẫn. Đương nhiên, nếu vi xử lý của bạn càng có nhiều nhân thì tức là mỗi nhân có thể nhận các chỉ dẫn khác nhau vàthực thi song songcác chỉ dẫn đó.

Rõ ràng là với vi xử lý có càng nhiều nhân, thì tức là tiềm năng xử lý của bộ vi xử lý đó càng mạnh. Tuy nhiên, vẫn còn rất nhiều câu hỏi khác về nhân vi xử lý:

  • Một vi xử lý Snapdragon 2.0 GHz với 8 nhân liệu có nghĩa là nó mạnh gấp 8 lần vi xử lý một nhân tương đương? Hay nói cách khác, ta có thể cho rằng8 * 2.0 = 16.082.0=16.0GHz?
  • Một vi xử lý Intel Core i5 với 2 nhân, 4 luồng nghĩa là sao? Nó liệu có mạnh ngang bằng một vi xử lý 4 nhân thông thường?

Hãy đọc tiếp những phần phía dưới, mình sẽ cùng các bạn từ từ làm rõ.

Siêu phân luồng[Hyperthreading] là tên gọi riêng của Intel cho kỹ thuật gọi làSimultaneous Multithreading[SMT]. Công nghệ này cho phép mỗi nhân thực [physical core] của vi xử lý có thể hiện diện như 2nhân ảo[logical core] đối với hệ điều hành. Nếu bạn thấy một vi xử lý mà có ghi thông tin là2 nhân, 4 luồng xử lýhay6 nhân 12 luồngthì tức là vi xử lý của bạn có hỗ trợ SMT. AMD cũng có thuật ngữ riêng cho các vi xử lý có hỗ trợ SMT của họ làCMT[Cluster-based Multithreading]. Tuy nhiên ở trong bài này, mình sẽ tạm dùng tên gọiHyperthreadingvì nó phổ biến hơn.

CPU thread và OS thread

Đây là một điều dễ gây nhầm lẫn với nhiều người.CPU threadchính là cáclogical core, tức là các nhân của CPU mà hệ điều hành nhìn thấy. Hệ điều hành hiểu những CPU thread này ngang với những nhân CPU thực sự, và bắt đầu giao cho những nhân này xử lý các tác vụ là những OS thread.

Với một vi xử lý có6 nhân 12 luồngthì tức là bạn đang có 12CPU thread, hay 12logical corekhác nhau. Hệ điều sẽ được phép lên lịch tối đa 12OS threadriêng biệt vào những core này. Trong cùng một thời điểm, những OS thread đó sẽ được các nhân xử lý [hầu như] song song.

Với vi xử lý trên thì số lượngCPU threadchỉ là 12 mà thôi. Tuy nhiên, số lượngOS threadthì lại được quản lý bởi hệ điều hành và có thể được tạo bao nhiêu tuỳ thích, có thểcó lên đến hàng ngànOS threadkhác nhautuỳ vào các chương trình mà bạn chạy.

Lưu ý nhỏ: khi ai đó chỉ nhắc đến từthread, thì trong đa phần trường hợp, người ta đang ám chỉ đếnOS thread!

Hyperthreading có thực sự giúp gấp đôi số nhân?

Hay nói cách khác,một vi xử lý được cho là có2 nhân 4 luồng, liệu hiệu năng có tương đương với một vi xử lý4 nhân 4 luồng, giả sử những thông số khác đều tương tự nhau? Nếu không, tại sao người ta còn dùng hyperthreading? Để trả lời câu hỏi này, ta phải đào sâu hơn tý về cách mà công nghệhyperthreadinghoạt động. Một vài thông tin mà mình tìm hiểu được như sau:

Từng nhân CPU có khả năng thực thi các chỉ dẫn cực nhanh [tính bằng nanosecond]. Nhưng đôi khi, việc thực thi của CPU bị trì hoãn [stall] vì nhiều lý do khác nhau, ví dụ nhưcache missing. Ví dụ như trong trường hợp đó, các lệnh chỉ dẫn sẽ phải được nạp lại từ bộ nhớ chính [RAM] vào cache của CPU. Vì bộ nhớ RAM rất chậm nếu so sánh vớiCPU cache, thao tác này [đối với CPU] là tương đối lâu và tạo cho CPU rất nhiều thời gian rảnh rỗi. Trong khoảnh khắc ngắn này, CPU đáng lẽ có thể thực thi thêm hàng trăm chỉ dẫn nữa.

Các nhân CPU hỗ trợhyperthreadingsẽ nhận tập lệnh chỉ dẫn của lên tới 2OS threadkhác nhau. Tuy mỗi nhân thực [physical core] này thực chất vẫn chỉ hỗ trợ thực thi tập lệnh từ 1OS threadtrong cùng một thời điểm, nhưng khác với nhân thông thường, nó lại có đến 2 bộthanh ghi[register] hoàn toàn độc lập. Khi gặp các sự kiện nhưcache missingkhi thực thi lệnh ở mộtOS thread, thay vì chờ không, nhân CPU này có thể nhanh chóng chuyển sang thực thi dãy lệnh ở OS thread kia ngay lập tức. Việc chuyển đổi này là cực nhanh vì nhân CPU này đã có 2 bộ thanh ghi riêng biệt, không mất công nhưcontext switchở cấp độ hệ điều hành.

Như vậy,hyperthreadingkhông phải là kỹ thuật giúp tăng gấp đôi số nhân [hay như gấp đôi hiệu năng] của vi xử lý, mà là giúp tận dụng triệt để khoảng thời gian rảnh rỗi của từng nhân CPU, giúp tăng đối đa throughput của vi xử lý.

Làm sao để so sánh hiệu năng giữa các CPU có/không có hyperthreading?

Ví dụ một bài toán như: giữa hai vi xử lýAMD Ryzen 3 3300X[4 nhân 8 luồng], và vi xử lýAMD Ryzen 5 3500[6 nhân 6 luồng] có giá tiền rất tương đồng nhau. Vậy nên chọn mua vi xử lý nào hơn?

Thoạt nhìn qua, bạn có thể thấyRyzen 3 3300Xcó hỗ trợ hyperthreading hẳn hoi, cònRyzen 5 3500vì lý do mờ ám nào đó lại thiếu mất công nghệ này. Đọc ở phần trên, bạn đã biết rằng hyperthreading không giúp x2 số nhân, nên không thể dùng phép so sánh 8 > 6 và kết luận ngay rằng3300Xnhanh hơn được. Vậy làm sao để so sánh?

Hyperthreadingthực chất việc có cải thiện hiệu năng nhiều hay ít còn phụ thuộc vào từng trường hợp, thường là cải thiện từ 20% đến 30% hiệu năng của CPU. Như vậy, ta có thể làm một phép toán nhanh: trong trường hợp tận dụng được 100% sức mạnh đa nhân, nếu3500có 6 nhân thực giúp hiệu năng tăng gấp 6 lần, thì với3300Xcó 4 nhân 8 luồng sẽ cho hiệu năng tăng xấp xỉ4 * 1.3 = 5.241.3=5.2lần [trong trường hợp tốt nhất]. Như vậy,3300Xdù cóhyperthreadingvẫn cho hiệu năng thua thiệt hơn so với3500.

Đọc đến đây, chúng ta đã có thể hiểu rằng, với vi xử lý có một nhân thì chỉ có thể chạy được duy nhất 1 thread trong cùng một thời điểm. Nhưng mình vẫn nhớ rằngthời xưa mình dùng máy tính có chipIntel Pentium IVchỉ có một nhân duy nhất, tuy nhiên máy tính của mình vẫn có thể cùng một lúc vừa nghe nhạc, vừa giải nén file, vừa lướt Web chăm nông trại,Rút cuộc làm thế nào mà chỉ vớiduy nhất một nhâncủa chipPentium IVlại làm được nhiều việc một lúc như thế??

Trong phim bộThe Flash, các speedster là những người có khả năng di chuyển rất nhanh. Một trong các plot twist chính của mùa đầu bộ phim liên quan đến việcmột speedster có thể nhanh đến mức có thể tạo ra ảo ảnh và ở 2 nơi cùng một lúc:

So với nhận thức thông thường của con người,vi xử lý của máy tính cũng là một thứ đặc biệt nhanh. Tuy chỉ có thể thực thi một tác vụ tại một thời điểm, nhờ cơ chếlên lịchcủa hệ điều hành mà chỉ một nhân CPU có thể qua lại xử lý rất nhiều thread khác nhau. Khi một thread được CPU xử lý đủ lâu, hệ điều hành sẽ tạm dừng việc xử lý thread này lại và đưa một thread kế tiếp trong hàng đợi cho CPU xử lý. Quá trình này diễn rađủ nhanh đến mức gây cho chúng taảo giácrằng các tác vụ đang được chạysong song! Nhờ vậy, tuy chỉ với một nhân CPU, hệ điều hành vẫn có thể đạt được đa nhiệm như thường.

Cơ chế được dùng để hệ điều hành chuyển qua lại các thread được gọi làContext Switch. Khi tiến hànhContext Switch, hệ điều hành sẽ tạm dừng thực thi một thread, lưu lại trạng thái thực thi của CPU và các thanh ghi rồi lưu vào RAM, sau đó khôi phục các trạng thái và bắt đầu thực thi thread kế tiếp trong hàng đợi. Nó khá tương đồng vớihyperthreadingnhưng lại là ở cấp độ hệ điều hành, và chậm hơn nhiều so vớihypertheadingdo phải thao tác đọc/ghi trạng thái các thanh ghi bằng bộ nhớ RAM.

Như vậy, để máy tính có thể đa nhiệm, vi xử lý có nhiều nhân là điều hoàn toàn không cần thiết, mà chỉ cần một nhân đủ nhanh là được rồi.

Một chiếc điện thoại với con chip SoCSnapdragon 625với xung nhịp 2.0 GHz và 8 nhân, vậy có phải trong mọi trường hợp mình đều áp dụng được phép tính2.0 * 8 = 16.02.08=16.0GHz?

Câu trả lời đơn giản làkhông phải trong mọi trường hợp.

Trong máy tính, có nhiều bài toán mà các chương trình hỗ trợ xử lý đa luồng, chia công việc lớn thành các công việc nhỏ chạy qua nhiều OS thread khác nhau, ví dụ từ bài toán đơn giản như nhân 2 ma trận, cho đến dựng video, Nhưng cũng có những bài toán mà có tính chất công việc này phụ thuộc vào kết quả của công việc kia, điển hình như tính số fibonacci thứnnhay giải mã dạng mã hoá AES CBC, những dạng bài toán này buộc phải thực hiện trên một nhân duy nhất. Vài trường hợp khác thì các chương trình có tiềm năng xử lý đa luồng, nhưng người lập trình lại không hỗ trợ hoặc không triệt để.

Tuy nhiên, nếu thiết bị của bạn có chạy nhiều các chương trình cùng một lúc, thì việc có nhiều nhân vẫn đem lại lợi thế đáng kể, do mỗi chương trình đều được chạy trên một hay nhiềuOS threadriêng biệt và chắc chắn tận dụng được đa nhân CPU.

Trên đây là những kiến thức mà mình tìm hiểu được. Tuy vậy, các thông tin chắc chắn còn nhiều chỗ chưa chính xác hay thiếu sót, hy vọng được các bạn để lại góp ý ở phần bình luận ở cuối bài viết ^^

Một vài nguồn tham khảo:

Video liên quan

Chủ Đề