3 poin oleh GN⁺ 2024-07-29 | 1 komentar | Bagikan ke WhatsApp
  • SMT adalah teknik yang memungkinkan satu core CPU menerbitkan instruksi dari beberapa thread pada siklus yang sama, untuk mengisi lebih banyak sumber daya eksekusi yang menganggur jika hanya mengandalkan paralelisme tingkat instruksi
  • Hyper-Threading dari Intel adalah implementasi dua thread per core; dengan mereplikasi architectural state, sistem operasi melihat satu core fisik seolah-olah sebagai dua prosesor logis
  • Implementasi nyata tidak sekadar menggandakan semua sumber daya: instruction pointer, ITLB, dan RAT direplikasi; trace cache dan TLB dibagi bersama; sementara uop queue, register fisik, dan reorder buffer dibagi rata
  • Peningkatan kinerja bergantung pada workload: jika dua thread saling berebut cache, kinerja bisa melambat; sedangkan thread kooperatif yang saling bertukar data dapat lebih cepat berkat cache bersama
  • Sumber daya bersama dan eksekusi spekulatif dapat berujung pada kerentanan keamanan, sehingga di lingkungan yang sensitif terhadap keamanan atau workload yang membutuhkan kinerja tertinggi dan latensi terendah, menonaktifkan SMT menjadi opsi yang realistis

Mengapa SMT Dibutuhkan

  • Prosesor modern memiliki ratusan register, beberapa unit load/store, dan unit aritmetika, serta menggunakan teknik paralelisme tingkat instruksi seperti pipelining, arsitektur superscalar, dan eksekusi out-of-order untuk memanfaatkannya
  • Pipeline membagi eksekusi instruksi menjadi beberapa tahap dan meneruskan instruksi ke tahap berikutnya pada setiap siklus; pada pipeline sedalam 5 tahap, setelah siklus ke-5 hingga 5 instruksi dapat berjalan bersamaan
  • Prosesor superscalar dapat menerbitkan beberapa instruksi dalam satu siklus, dan prosesor Intel Core i7 terbaru dapat menerbitkan 4 instruksi dalam satu siklus
  • Dalam program nyata, sulit menemukan instruksi independen yang cukup, sehingga ada waktu ketika sumber daya eksekusi menganggur
    • Pemborosan horizontal terjadi ketika dalam satu thread tidak ditemukan instruksi independen yang cukup untuk mengisi issue width
    • Pemborosan vertikal terjadi ketika instruksi berikutnya bergantung pada instruksi yang sedang dieksekusi, sehingga tidak ada instruksi yang dapat diterbitkan dalam satu siklus
  • Multithreading tradisional hanya menerbitkan instruksi dari satu thread pada setiap siklus lalu beralih ke thread lain pada siklus berikutnya, sehingga dapat mengurangi pemborosan vertikal, tetapi pemborosan horizontal dan overhead context switching tetap ada
  • SMT menerbitkan instruksi dari beberapa thread pada siklus yang sama tanpa context switching, sehingga mengisi sumber daya eksekusi dengan tingkat pemanfaatan yang lebih tinggi
  • Hyper-Threading, implementasi SMT dari Intel, dibatasi pada dua thread per core

Struktur Dasar SMT ala Intel

  • Prosesor non-SMT pada umumnya hanya dapat menjalankan instruksi dari satu thread pada satu waktu
  • Setiap thread memiliki architectural state yang mencakup nilai register, program counter, register kontrol, dan sebagainya
  • Untuk menjalankan instruksi dari dua thread secara bersamaan, state dari kedua thread harus dapat direpresentasikan secara bersamaan, sehingga implementasi SMT mereplikasi architectural state prosesor
  • Karena replikasi ini, satu prosesor fisik terlihat oleh sistem operasi sebagai dua prosesor logis, dan sistem operasi dapat menjadwalkan thread ke masing-masing
  • Buffer dan sumber daya eksekusi pada tingkat mikroarsitektur direplikasi, dibagi bersama, atau dipartisi bergantung pada faktor seperti biaya, daya, dan luas chip
  • Pembahasan ini terutama berfokus pada implementasi SMT Intel dan didasarkan pada white paper Intel tahun 2002

Tiga Bagian Mikroarsitektur CPU

  • Prosesor menyediakan ISA kepada programmer sebagai antarmuka publik, dan ISA mencakup set instruksi serta register yang dapat digunakan oleh instruksi
  • Mikroarsitektur adalah implementasi internal yang dapat berbeda antar model prosesor yang mendukung ISA yang sama
  • Mikroarsitektur prosesor modern secara garis besar terbagi menjadi tiga bagian
    • Frontend: mencakup unit kontrol instruksi yang mengambil dan mendekode instruksi program berikutnya yang akan dieksekusi
    • Backend: mencakup sumber daya eksekusi seperti register fisik, unit aritmetika, dan unit load/store, serta mengalokasikan sumber daya untuk instruksi yang telah didekode dan menjadwalkan eksekusinya
    • retirement unit: akhirnya menerapkan hasil instruksi yang telah dieksekusi ke architectural state prosesor

SMT di Frontend

  • Instruction pointer melacak alamat instruksi berikutnya yang akan diambil
    • Prosesor berkemampuan SMT memiliki dua set instruction pointer untuk melacak instruksi berikutnya dari dua program secara independen
  • Trace cache menyimpan trace instruksi yang baru didekode untuk mengurangi biaya decoding dan latensi eksekusi instruksi yang dijalankan berulang
    • Dibagi secara dinamis oleh dua prosesor logis sesuai kebutuhan
    • Jika satu thread menjalankan lebih banyak instruksi, ia dapat menempati lebih banyak entri trace cache
    • Setiap entri diberi tag dengan informasi thread untuk membedakan instruksi dari dua thread
    • Akses trace cache diarbitrasi di antara dua prosesor logis pada setiap siklus
  • Jika terjadi trace cache miss, frontend mencari instruksi pada alamat tersebut di L1 instruction cache; jika terjadi L1 instruction cache miss, instruksi harus diambil dari cache tingkat berikutnya atau memori utama
  • L1 instruction cache melakukan cache data berdasarkan alamat virtual, tetapi akses ke memori utama membutuhkan alamat fisik
  • ITLB menyimpan alamat virtual yang baru dikonversi untuk menerjemahkan alamat virtual menjadi alamat fisik
    • Pada prosesor berkemampuan SMT, setiap prosesor logis memiliki ITLB cache sendiri
    • Logika pengambilan instruksi dari memori utama bekerja dengan prinsip first come first served, tetapi mencadangkan setidaknya satu slot permintaan untuk setiap prosesor logis agar keduanya dapat terus berjalan
    • Instruksi yang tiba dari memori utama disimpan dalam streaming buffer kecil sebelum didekode; pada prosesor berkemampuan SMT, buffer ini juga direplikasi untuk tiap prosesor logis
  • Setelah diambil, instruksi didekode menjadi uop yang lebih kecil dan sederhana
    • uop masuk ke uop queue yang menjadi batas antara frontend dan backend CPU
    • uop queue dibagi rata di antara dua prosesor logis, dan partisi statis ini memungkinkan dua prosesor logis berjalan secara independen

SMT di Backend

  • Backend mengambil mikroinstruksi dari uop queue dan mengeksekusinya, tetapi tidak hanya terikat pada urutan program asli; ia melakukan eksekusi out-of-order
  • Instruksi program yang berdekatan sering kali saling bergantung, dan jika ada operasi dengan latensi panjang seperti pembacaan memori utama, instruksi yang bergantung juga harus menunggu
  • Mesin eksekusi out-of-order menjalankan instruksi yang lebih belakang lebih dulu daripada urutan aslinya untuk mengurangi pemborosan sumber daya
  • Allocator mengidentifikasi sumber daya yang dibutuhkan oleh mikroinstruksi dan mengalokasikannya berdasarkan ketersediaan
    • Dalam satu siklus, allocator mengalokasikan sumber daya untuk mikroinstruksi dari satu prosesor logis, lalu pada siklus berikutnya beralih ke prosesor logis lainnya
    • Jika uop queue hanya berisi mikroinstruksi dari satu prosesor logis atau satu prosesor logis telah menghabiskan semua jatah sumber dayanya, allocator menggunakan semua siklus untuk prosesor logis lainnya
  • Sumber daya utama di backend menggunakan campuran replikasi, berbagi, dan partisi
    • Pada tingkat ISA, X86-64 hanya memiliki 16 register integer serbaguna, tetapi pada tingkat mikroarsitektur terdapat ratusan register integer fisik dan jumlah register floating-point yang serupa
    • Pada prosesor berkemampuan SMT, register fisik dibagi rata untuk dua prosesor logis
    • Load buffer dan store buffer yang digunakan untuk operasi baca/tulis memori juga dibagi rata untuk dua prosesor logis

Register Renaming, Penjadwalan, dan Commit

  • Untuk eksekusi out-of-order, backend melakukan register renaming
    • Karena pada tingkat ISA jumlah architectural register sedikit, instruksi program menggunakan ulang register yang sama pada beberapa instruksi independen
    • Mesin eksekusi out-of-order mengganti register logis asli dengan salah satu register fisik untuk memungkinkan eksekusi paralel dengan eksekusi sebelumnya
    • Pemetaan ini disimpan dalam register alias table, yaitu RAT
    • Karena dua prosesor logis masing-masing memiliki set architectural register sendiri, RAT juga memiliki salinan masing-masing
  • Instruksi yang telah melewati tahap register renaming dan allocator masuk ke ready queue
    • Satu queue digunakan untuk instruksi baca/tulis memori, dan satu lagi untuk instruksi umum
    • Pada core berkemampuan SMT, queue ini dibagi rata untuk dua prosesor logis
  • Prosesor memiliki beberapa instruction scheduler secara paralel
    • Pada setiap siklus CPU, sebagian instruksi di ready queue diteruskan ke scheduler
    • Queue mengirim instruksi dari satu prosesor logis pada satu siklus, lalu beralih ke prosesor logis lainnya pada siklus berikutnya
    • Scheduler tidak memperhatikan prosesor logis; ia segera mengirim mikroinstruksi yang operand dan unit eksekusinya sudah siap untuk dieksekusi
    • Demi fairness, ada batas jumlah active entry yang dapat dimiliki satu prosesor logis di dalam scheduler queue
  • Hasil instruksi yang selesai dieksekusi masuk ke reorder buffer
    • Meskipun instruksi dieksekusi out-of-order, instruksi harus di-commit ke architectural state prosesor sesuai urutan program asli
    • Pada core berkemampuan SMT, reorder buffer dibagi rata untuk dua prosesor logis
  • Retirement unit melacak apakah instruksi siap di-commit ke architectural state dan melakukan retire sesuai urutan program yang benar
    • Pada core berkemampuan SMT, unit ini memproses mikroinstruksi dari tiap prosesor logis secara bergantian
    • Jika satu prosesor logis tidak memiliki mikroinstruksi untuk di-retire, seluruh bandwidth digunakan untuk prosesor logis lainnya
    • Setelah instruksi retire, mungkin perlu dilakukan penulisan ke L1 cache, dan logika pemilihan penulisan ini juga memproses dua prosesor logis secara bergantian pada setiap siklus

Subsistem Memori dan Dampak Cache

  • TLB yang mengubah alamat virtual permintaan data menjadi alamat fisik dibagi secara dinamis oleh dua prosesor logis sesuai kebutuhan
  • Entri TLB diberi tag dengan logical processor id untuk membedakan entri milik dua prosesor logis
  • Setiap core CPU memiliki private L1 cache sendiri
  • L2 cache bisa private atau dibagi antar-core, tergantung mikroarsitektur
  • Jika ada L3 cache, cache tersebut dibagi antar-core
  • Cache tidak menyadari keberadaan prosesor logis
  • Karena L1 cache dan, dalam beberapa kasus, L2 cache bersifat private untuk core, cache tersebut menampung data dari dua prosesor logis bersama-sama sesuai kebutuhan
    • Jika dua thread menggunakan cache secara agresif, konflik data dan eviction dapat terjadi sehingga menurunkan kinerja
    • Jika dua thread bekerja pada kumpulan data yang sama, cache bersama dapat meningkatkan kinerja

Kriteria Pilihan dalam Kinerja dan Keamanan

  • Bahkan ketika hanya satu thread berjalan pada core berkemampuan SMT, banyak buffer dan sumber daya eksekusi tetap dibagi bersama atau dipartisi di antara dua prosesor logis, sehingga dapat menurunkan potensi kinerja satu thread
  • Pada prosesor logis yang tidak digunakan, sistem operasi menjalankan idle loop, dan loop ini juga dapat mengonsumsi sumber daya yang seharusnya bisa dipakai prosesor logis lain untuk mencapai kinerja maksimal
  • Pada prosesor Intel Core, ketika hanya satu thread berjalan di sebuah core, tampaknya tidak ada berbagi atau partisi sumber daya, dan Intel memperlakukannya sebagai peningkatan yang diperkenalkan pada generasi tersebut
  • Ketika dua thread berjalan pada dua prosesor logis di core berkemampuan SMT, pola akses cache menentukan kinerja
    • Jika dua thread bersaing memperebutkan cache, keduanya dapat meng-evict data satu sama lain sehingga kinerja turun
    • Jika keduanya kooperatif, seperti ketika satu thread memproduksi data yang dikonsumsi thread lain, berbagi data cache dapat meningkatkan kinerja
    • Jika dua thread tidak menggunakan cache secara kompetitif, pemanfaatan sumber daya core CPU dapat meningkat tanpa saling mengganggu kinerja
  • Banyak pakar berpendapat bahwa untuk program yang membutuhkan kinerja maksimum absolut, sebaiknya SMT dimatikan agar satu thread dapat menggunakan semua sumber daya
  • SMT juga membawa masalah keamanan
    • Karena sumber daya bersama dan eksekusi spekulatif, ada kemungkinan data sensitif bocor ke penyerang
    • Dokumentasi Oracle Linux dan Red Hat ditautkan sebagai contoh isu keamanan terkait SMT
    • Saran umum adalah menonaktifkan SMT pada sistem
    • Ada pula rumor bahwa Intel mungkin menghapus Hyper-Threading pada prosesor generasi berikutnya, Arrow Lake

Referensi

1 komentar

 
GN⁺ 2024-07-29
Pendapat di Hacker News
  • Kalau memahami SMT dengan sangat disederhanakan, poin bahwa ALU yang berharga bisa terus dibuat sibuk saat thread terhenti karena cache miss terasa masuk akal
    LPDDR di laptop lama lebih lambat dan jumlah core juga lebih sedikit, jadi mungkin nilainya lebih besar, tetapi sekarang sering kali jumlah core lebih banyak daripada pekerjaan yang bisa diskalakan, sehingga nilainya kurang terasa
    Kadang pekerjaan tidak ditempatkan pada core yang sama dengan thread penting untuk menghindari kontensi cache, karena diketahui bahwa performa single-thread adalah bottleneck
    Dulu saya menguji core Efficient/Performance dan core SMT pada rendering multi-thread DirectX 12; di i7-12700K, waktu rendering adegan kompleks hampir sama antara hanya memakai P-core, P+SMT, dan P+E+SMT. Namun di Xbox Series X, tes yang sama sedikit lebih cepat ketika pekerjaan juga ditempatkan pada SMT

    • Sejak awal, rendering adalah salah satu skenario yang sama atau lebih lambat di SMT. Operasi matematikanya sudah banyak sehingga FPU selalu sibuk, terutama karena unit pembagian adalah operasi paling mahal di prosesor
      SMT bersinar saat menunggu input/output atau mengerjakan operasi integer sederhana. Jika dua thread sama-sama bisa menjenuhkan FPU, SMT umumnya menjadi lebih lambat karena tagging tambahan untuk menandai kepemilikan data internal CPU
    • Hyper-Threading Intel pada dasarnya lebih mirip hack pada pipeline penulisan
      Intinya bukan cache miss, melainkan memungkinkan core menjalankan pekerjaan lain saat penulisan selesai
      Karena itu sebagian kode tidak bisa diskalakan dengan baik, sementara sebagian kode lain mendapat peningkatan kecepatan yang hampir linear
    • Sekarang, terutama jika mempertimbangkan penyaluran daya dari sisi belakang, saya penasaran seberapa besar penghentian cache pada satu prosesor mengurangi thermal throttling pada prosesor itu dan prosesor tetangganya
      Mungkin lebih baik membiarkan prosesor-prosesor semacam ini tidur sebentar sesekali
    • Terkait bagian bahwa LPDDR dulu lebih lambat, anehnya latensi tidak banyak membaik. Latensi CAS DDR2/3/4/5 umumnya berada di kisaran 5–10 ns
      Lebar bus, jumlah transfer per detik, queueing, dan daya per transfer/penyimpanan bit memang membaik, tetapi jika program membutuhkan data yang tidak ada di cache dan prediksi juga meleset, pada akhirnya latensi RAM yang menjadi masalah
    • Saya penasaran apakah, alih-alih SMT, kita bisa mematikan sebentar ALU/FPU yang tidak digunakan saat menunggu sesuatu di front-end pipeline, sehingga arahnya lebih ke mengurangi panas dan konsumsi daya daripada memaksimalkan utilisasi
  • CPU Arrow Lake generasi berikutnya dari Intel kabarnya akan sepenuhnya menghapus Hyper-Threading, alias SMT
    Keuntungan performanya selalu sangat bergantung pada aplikasi, jadi mungkin lebih baik disederhanakan
    Diskusi terbaru tentang kapan dan di mana ini bermakna ada di sini: https://news.ycombinator.com/item?id=39097124

    • Sebagian besar program punya batas jumlah thread yang bisa digunakan secara masuk akal. Saat jumlah core jauh lebih sedikit dari itu, SMT masuk akal untuk memanfaatkan sumber daya CPU dengan lebih baik, tetapi begitu core sudah cukup, SMT bisa jadi tidak lagi masuk akal
      Saya belum yakin kita sudah pasti mencapai titik itu, tetapi P/E core Intel adalah alternatif menuju tujuan yang mirip dan cukup masuk akal untuk desktop yang banyak menjalankan pekerjaan single-thread dan low-thread. Tampaknya juga ada nilai dari tidak perlu menangani perbedaan SMT dan E-core dalam optimasi aplikasi
      Sebaliknya, AMD untuk sementara berencana mempertahankan core yang sebagian besar homogen dan terus memakai SMT. Strategi mana yang lebih baik dalam praktiknya tampaknya akan sangat bergantung pada aplikasi, sehingga sulit dinilai secara sederhana
    • Dalam kasus penggunaan pribadi saya membuat game dan engine, lebih cepat berdoa kepada dewa penjadwalan thread CPU agar tiap thread mendapat core sendiri daripada memakai Hyper-Threading
      Jadi saya memutuskan membatasi jumlah thread menjadi std::thread::hardware_concurrency() / 2 - 1, yaitu jumlah core - 1. Saya sedang menangani std::vector
    • Berdasarkan benchmark yang umum di industri, Intel Hyper-Threading setidaknya sekali setiap dua generasi lebih lambat daripada jika dimatikan
      Bahkan saat bekerja dengan baik, peningkatannya hanya belasan persen, dan ada masa ketika hasilnya lebih buruk pada beberapa generasi berurutan; saya tidak tahu mengapa mereka terus mencobanya
    • Apakah itu juga berlaku pada komponen server?
  • Saya selalu takjub setiap kali membaca bagaimana fitur CPU tingkat rendah seperti ini bekerja
    Saat kuliah saya mengambil kelas yang kira-kira bernama “pengantar perangkat keras komputer”, tetapi sebenarnya seharusnya disebut “pengantar desain CPU”. Kami membuat adder, latch, flip-flop, dan sebagainya dari gerbang logika, dan pada akhir semester bisa merancang prosesor yang sangat dasar di level gerbang
    Namun saya sulit membayangkan bagaimana orang bisa memikirkan dan menciptakan hal-hal seperti register renaming atau out-of-order execution. Apakah hal-hal seperti ini juga dirancang di level gerbang? Atau ada bahasa yang digunakan dan semacam “compiler” yang menempatkan gerbang serta transistor?

    • Saya mengambil kelas tingkat berikutnya, dan mempelajari SMT serta beberapa hal lain
      Semua tugas dikerjakan dengan bahasa deskripsi perangkat keras bernama Verilog, sehingga kami bisa menulis dengan mengabstraksikan berbagai elemen
  • Salah satu kesalahpahaman besar yang umum dimiliki pengguna tentang SMT adalah model mental yang membayangkan ada satu “core sungguhan” dan satu core lain yang lebih inferior
    Dalam semua aspek yang bisa diamati, kedua thread itu setara

    • Persepsi seperti itu tampaknya berasal dari performa. Dua thread memang bisa menjalankan pekerjaan yang sama, tetapi performanya tidak menjadi 2 kali lipat seperti ketika ada thread kedua yang “sungguhan”, yaitu core kedua
      Pada akhirnya, jika hanya melihat performa, secara konseptual ini lebih mirip sekitar 1,25 core single-thread, atau sebanyak rasio itu tergantung aplikasinya
    • Saat menjalankan pekerjaan yang sangat dioptimalkan dan berat komputasi seperti kompresi video, kipas komputer meraung seperti mesin jet tetapi Task Manager menampilkan penggunaan CPU 50%, wajar jika persepsi seperti itu muncul
    • CPU baru Intel memang punya core sungguhan yang disebut “P-core” dan core inferior yang disebut “E-core”
      Menurut saya alasan utama memperkenalkan E-core bukanlah penggunaan daya atau performa, melainkan panas dan luas die. Karena itu saya selalu membeli chip tanpa E-core, dan saya pikir yang itu lebih baik
  • Saya penasaran bagaimana cara mencari tulisan teknis mendetail semacam ini
    Saya sudah mencari dengan topik persis ini, tetapi seperti dugaan, karena ini teknologi yang ditujukan ke pengguna akhir, hasil pencariannya hanya berisi artikel untuk pengguna yang tidak benar-benar menjelaskan apa pun

    • Bisa memakai https://hn.algolia.com. Dengan asumsi sebagian besar tulisan seperti ini muncul atau disebut di HN
    • LLM yang bisa mengakses web menurut saya cukup cocok untuk pencarian seperti ini. Setidaknya membantu menentukan arah
      Namun URL yang diberikannya kebanyakan halusinasi
    • Saya tidak tahu apakah Google melacak lonjakan minat terhadap artikel itu karena posting HN ini, tetapi saat mencari “how does simultaneous multi threading work”, artikel blog ini muncul kira-kira sebagai hasil ke-5 bagi saya
      Saya mengeceknya di tab privat Firefox baru pada perangkat lain; memang tidak sepenuhnya mencegah pelacakan atau caching, tetapi menurut saya itu perkiraan yang cukup masuk akal
  • Penjelasan bahwa “pada core CPU dengan SMT aktif, banyak buffer dan sumber daya eksekusi harus dibagi oleh dua prosesor logis, sehingga meski hanya satu thread yang berjalan pada core SMT, sumber daya itu tidak dapat dipakai oleh thread tersebut dan potensi performanya berkurang” sekarang sudah tidak benar
    Dalam mode SMT, ROB, bandwidth fetch/decode, dan sebagainya memang dibagi, tetapi saya sudah melihat berbagai core SMT yang memungkinkan seluruhnya dipakai saat tidak dalam mode SMT

    • Prosesor Phi seri x200 bekerja persis seperti itu. Dalam mode non-SMT, tiap thread mendapatkan sumber daya jauh lebih banyak dibanding mode SMT 4-way
  • Tujuan utama SMT adalah memaksimalkan utilisasi mesin eksekusi superskalar
    Saya penasaran apakah tren seperti ini berarti orang-orang menganggap superskalar tidak sepenting dulu

  • Secara keseluruhan ini ringkasan yang bagus, tetapi di beberapa bagian terasa agak tercampur-aduk
    Saya ingin tahu lebih banyak kiat praktis di lapangan yang dipakai orang dalam, setidaknya yang tidak terkait keamanan

  • Kasihan arsitektur Bulldozer dari AMD, dulu begitu banyak dihujat karena tidak punya SMT, tetapi sekarang semua orang mulai menjauh dari SMT
    Tentu saya tahu Bulldozer punya jauh lebih banyak masalah selain ketiadaan SMT. Sebenarnya strukturnya lebih mirip kebalikan, dengan beberapa core berbagi hal seperti ALU yang sama. Meski begitu, kalau saja performanya bisa didorong sedikit lebih jauh, mungkin ia bisa dibilang sudah melihat sesuatu lebih dulu

    • Arsitektur PowerXX tidak sedang menjauh dari SMT
      Power10 saat ini secara efektif mendukung SMT8 dengan 8 thread per core, dan melihat upaya mereka selama bertahun-tahun dalam terus mengembangkan desain yang berpusat pada SMT, saya rasa mereka tidak akan meninggalkannya
  • Hal yang patut diketahui adalah unit komputasi GPU juga biasanya memakai SMT pada kisaran 7–10 thread per CU
    Cara ini membantu menyembunyikan latensi

    • Sebagian besar GPU tidak memakai SMT, melainkan pendahulunya, yaitu fine-grained multithreading
      Pada setiap siklus clock, ia memilih instruksi dari salah satu dari beberapa thread yang tersedia, yang membutuhkan sumber daya yang tidak sedang sibuk, lalu mulai menjalankannya. Sebagian besar GPU tidak memulai beberapa instruksi per clock, meski beberapa instruksi bisa berjalan bersamaan setelah dimulai. Kalaupun memulai beberapa instruksi per clock, instruksi-instruksi itu mungkin harus termasuk kelas instruksi berbeda yang memakai sumber daya eksekusi berbeda, seperti instruksi skalar dan instruksi vektor
      SMT, yaitu simultaneous multithreading, adalah metode ketika pada setiap siklus clock banyak instruksi dari semua thread dimulai secara bersamaan, dan instruksi-instruksi itu bersaing memperebutkan berbagai unit eksekusi pada CPU superskalar agar sebanyak mungkin unit eksekusi tetap sibuk. Untuk setiap unit eksekusi paralel, seperti masing-masing dari 6 integer adder pada CPU modern, keputusan tentang instruksi mana yang akan dijalankan dibuat secara terpisah dari antrean berisi instruksi dari semua thread yang berjalan serentak