Apa yang dilakukan prosesor saat menunggu memori utama diambil


26

Dengan anggapan permintaan cache l1 dan l2 menghasilkan kesalahan, apakah prosesor berhenti sampai memori utama telah diakses?

Saya mendengar tentang gagasan untuk beralih ke utas lain, jika demikian, apa yang digunakan untuk membangunkan utas yang macet?


4
Penelitian apa yang telah Anda lakukan? Ini tentu informasi yang tersedia. Saya akan meninggalkan jawaban kepada para ahli, tetapi saya tidak berpikir thread switch adalah hal yang berguna untuk dilakukan. Umumnya, beralih konteks pada CPU akan menyebabkan banyak akses memori (dan karenanya, mungkin cache misses). Ada beberapa langkah seperti operasi pemesanan ulang (menggunakan pipa) tetapi menunda tampaknya tidak memiliki alternatif.
Raphael

@ Raphael Saya baru saja membaca buku arsitektur komputer, ARM System-on-Chip Architecture oleh Steve Furber, mungkin yang paling komprehensif yang pernah saya baca sepenuhnya. Namun saya sudah mulai membaca Arsitektur Komputer: Pendekatan Kuantitatif. Ini membahas teknik untuk menghindari kemacetan seperti pengalihan ulir, OOE, dan operasi memori yang rusak, meskipun tidak pernah benar-benar memberi banyak tentang seluk-beluk desain modern, karena seperti kebanyakan buku teks mereka membahas arsitektur yang lebih tua atau memberikan saran samar tentang bagaimana hal-hal ini diimplementasikan dan bekerja bersama.
102948239408

Memperluas pertanyaan saya, cache tampaknya memiliki latency yang lebih kecil dan menjadi deterministik dalam respons mereka tetapi jika tabel tabel skenario kasus berjalan untuk mengambil alamat fisik, ribuan instruksi dapat diselesaikan, beberapa dari thread yang sama diekstraksi oleh ILP. Interaksi perangkat keras apa yang terjadi pada prosesor untuk memutuskan bahwa mungkin menjadwalkan utas lainnya dan komunikasi apa yang digunakan untuk membangunkan utas tersebut jika ini terjadi. Lebih jauh lagi jika OoOE apakah ada teknik untuk berurusan dengan antrian hasil penuh ketika beralih thread?
102948239408

1
Tidak jelas dari pertanyaan Anda bahwa Anda tertarik pada rincian CPU modern. Tidak hanya itu mungkin offtopic, itu mungkin juga informasi eksklusif. Dengan konsepnya, kami dapat membantu Anda; ini mungkin telah berubah kurang dari beberapa dekade daripada implementasi. Mengenai pertanyaan Anda, harap sertakan apa yang Anda ketahui dan rumuskan pertanyaan spesifik, konseptual (atau permintaan referensi).
Raphael

1
Saya sudah menjawab tentang konsep-konsep umum, tetapi menilai dari komentar Anda, Anda mungkin setelah pertimbangan yang lebih maju. Namun, jika Anda menginginkan jawaban yang lebih lanjut, Anda harus membuat pertanyaan Anda lebih spesifik untuk arsitektur dan jenis teknik tertentu.
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:


28

Memori latensi adalah salah satu masalah mendasar yang dipelajari dalam penelitian arsitektur komputer.

Eksekusi Spekulatif

Eksekusi spekulatif dengan masalah instruksi out-of-order sering dapat menemukan pekerjaan yang berguna untuk mengisi latensi selama hit cache L1, tetapi biasanya kehabisan pekerjaan yang bermanfaat setelah 10 atau 20 siklus atau lebih. Ada beberapa upaya untuk meningkatkan jumlah pekerjaan yang dapat dilakukan selama absen latensi panjang. Satu ide adalah mencoba melakukan prediksi nilai (Lipasti, Wilkerson dan Shen, (ASPLOS-VII): 138-147, 1996). Gagasan ini sangat populer di kalangan penelitian arsitektur akademik untuk sementara waktu tetapi tampaknya tidak berhasil dalam praktiknya. Upaya terakhir terkesiap untuk menyimpan prediksi nilai dari tempat sampah sejarah adalah eksekusi runahead(Mutlu, Stark, Wilkerson, dan Patt (HPCA-9): 129, 2003). Dalam eksekusi runahead Anda mengakui bahwa prediksi nilai Anda akan salah, tetapi tetap mengeksekusi spekulatif dan kemudian membuang semua pekerjaan berdasarkan prediksi, pada teori bahwa Anda setidaknya akan memulai beberapa prefetch untuk apa yang seharusnya menjadi L2 cache kangen. Ternyata runahead membuang begitu banyak energi sehingga tidak layak.

Pendekatan terakhir dalam nada ini yang mungkin mendapatkan daya tarik dalam industri melibatkan menciptakan buffer pemesanan ulang sangat lama. Instruksi dijalankan secara spekulatif berdasarkan prediksi cabang, tetapi tidak ada prediksi nilai yang dilakukan. Alih-alih, semua instruksi yang bergantung pada long-latency load miss sit dan tunggu di buffer pemesanan ulang. Tetapi karena buffer pemesanan ulang begitu besar Anda dapat terus mengambil instruksi jika prediktor cabang melakukan pekerjaan yang layak, Anda kadang-kadang dapat menemukan pekerjaan yang berguna jauh di aliran instruksi. Makalah penelitian yang berpengaruh di bidang ini adalah Continual Flow Pipelines(Srinivasan, Rajwar, Akkary, Gandhi, dan Upton (ASPLOS-XI): 107-119, 2004). (Terlepas dari kenyataan bahwa semua penulis berasal dari Intel, saya yakin gagasan itu mendapat lebih banyak daya tarik di AMD.)

Multi-threading

Menggunakan banyak utas untuk toleransi latensi memiliki sejarah yang jauh lebih lama, dengan keberhasilan yang jauh lebih besar di industri. Semua versi yang sukses menggunakan dukungan perangkat keras untuk multithreading. Versi paling sederhana (dan paling sukses) dari ini adalah apa yang sering disebut FGMT ( multi-threading berbutir halus ) atau multi-threading yang disisipkan . Setiap inti perangkat keras mendukung beberapa konteks utas ( konteks pada dasarnya adalah status register, termasuk register seperti penunjuk instruksi dan register flag implisit apa pun). Dalam prosesor multi-threading fine-grained setiap thread diproses di-memesan. Prosesor melacak thread mana yang terhenti pada miss-latency load yang lama dan yang siap untuk instruksi mereka berikutnya dan menggunakan strategi penjadwalan FIFO sederhana pada setiap siklus untuk memilih thread yang siap untuk menjalankan siklus itu. Contoh awal dari ini dalam skala besar adalah prosesor HEP Burton Smith (Burton Smith melanjutkan ke arsitek superkomputer Tera, yang juga merupakan prosesor multi-threading berbutir halus). Tapi idenya jauh lebih jauh ke belakang, ke tahun 1960-an, saya pikir.

FGMT sangat efektif untuk mengalirkan beban kerja. Semua GPU modern (unit pemrosesan grafis) adalah multicore di mana setiap inti adalah FGMT, dan konsep ini juga banyak digunakan dalam domain komputasi lainnya. Sun T1 juga multicore FMGT, dan begitu pula Intel Xeon Phi (prosesor yang sering disebut "MIC" dan dulu disebut "Larabee").

Gagasan Multithreading Simultan (Tullsen, Eggers, dan Levy, (ISCA-22): 392-403, 1995) menggabungkan perangkat keras multi-threading dengan eksekusi spekulatif. Prosesor memiliki beberapa konteks utas, tetapi setiap utas dijalankan secara spekulatif dan tidak sesuai pesanan. Penjadwal yang lebih canggih kemudian dapat menggunakan berbagai heuristik untuk mengambil dari utas yang kemungkinan besar memiliki pekerjaan yang bermanfaat ( Malik, Agarwal, Dhar, dan Frank, (HPCA-14: 50-61), 2008 ). Sebuah perusahaan semikonduktor besar tertentu mulai menggunakan istilah hyperthreading untuk multithreading simultan, dan nama itu tampaknya menjadi yang paling banyak digunakan saat ini.

Kekhawatiran mikroarsitektur tingkat rendah

Saya menyadari setelah membaca ulang komentar Anda bahwa Anda juga tertarik dengan pensinyalan yang terjadi antara prosesor dan memori. Cache modern biasanya memungkinkan beberapa kesalahan secara bersamaan beredar. Ini disebut cache bebas Lockup (Kroft, (ISCA-8): 81-87, 1981). (Tetapi makalah ini sulit ditemukan secara online, dan agak sulit dibaca. Jawaban singkat: ada banyak pembukuan tetapi Anda hanya menanganinya. Struktur pembukuan perangkat keras disebut MSHR (miss information / status holding register) ), yang merupakan nama yang diberikan Kroft dalam makalahnya tahun 1981.)


Terima kasih jawaban yang sangat komprehensif, saya akan mencoba dan melihat ke dalam cache yang bebas penguncian. Pertanyaan saya yang bernada buruk itu benar-benar ingin memastikan bahwa prosesor memang melanjutkan beban dan penyimpanan selama akses memori utama dan teknik mikroarsitektur apa yang digunakan untuk melakukan ini.
102948239408

+1, 1. Apakah ini benar-benar memproses barel jika penjadwalan round-robin tidak digunakan? Wikipedia menjadikannya sinonim untuk FGMT. (Saya dapat menerima penerapan "prosesor barel" untuk round robin dengan melompati, meskipun hal itu mematahkan analogi sebagai paranada yang hilang (lih. Utas yang tidak siap) tidak mengontrak keliling per barel. (Saya pikir prosesor barel "benar" adalah ? langka-mungkin perifer prosesor untuk CDC 6600 -karena mereka buang siklus tetapi tidak hardware menyederhanakan) 2. menyebutkan SoEMT seperti Itanium Hyper-Threading dan IBM Northstar et al tampaknya sangat tepat diberikan pertanyaan...
Paul A. Clayton

@ 102948239408, hal lain yang mungkin Anda cari di Google adalah istilah-istilah seperti "hit under miss" dan "miss under miss" (opsi lain adalah "stall under miss", tapi saya baru mencobanya dan sepertinya tidak ada yang berguna.) istilah yang saat ini digunakan oleh (beberapa) arsitek untuk opsi yang berbeda dari apa yang dimungkinkan oleh cache.
Pengembaraan Logika

@ PaulA.Clayton, terminologi jelas bukan setelan kuat saya. Saya setuju dengan Anda bahwa pemrosesan barel berarti round-robin. Tapi saya tidak bisa memikirkan istilah lain yang artinya: siklus-demi-siklus interleaving dari sekelompok thread in-order (yang dilakukan oleh GPU, Xeon Phi dan Sun T1). Apakah itu FGMT? Saya selalu menganggap FGMT sebagai termasuk SMT, (yaitu, tidak menentukan bahwa utas harus dijalankan secara berurutan) tetapi mungkin FGMT lebih baik daripada "prosesor barel" untuk kasus ini?
Pengembaraan Logika

Artikel prosesor Wikipedia Barrel menyatakan: "juga dikenal sebagai multithreading" interleaved "atau" fine-grained ", sehingga IMT dan FGMT setidaknya merupakan istilah yang dikenal. Saya pikir saya telah membaca "berbutir halus" lebih dari "disisipkan", tetapi disisipkan tidak jarang. Saya biasanya menggunakan FG (bagi saya "berbutir" berarti lebih banyak pemisahan daripada yang disediakan SMT); FG memiliki keunggulan yang bisa diintegrasikan ke SoEMT. Saya menduga ini hanya perubahan dalam penggunaan "prosesor barel" yang saya harus nyengir (gigi saya) dan menanggung.
Paul A. Clayton

16

Jawaban singkatnya adalah: tidak ada, prosesor terhenti.

Tidak banyak kemungkinan. Beralih ke tugas yang berbeda sebenarnya bukan pilihan karena dua alasan. Itu operasi yang mahal, dan karena tugas saat ini dan tugas lainnya bersaing untuk mendapatkan ruang di cache, beralih ke tugas lain itu sendiri mungkin memerlukan akses memori utama, dan karenanya dapat beralih kembali ke tugas semula. Lebih jauh lagi, ini harus melibatkan sistem operasi, sehingga prosesor harus memicu beberapa bentuk interupsi atau perangkap - bahkan prosesor akan beralih ke beberapa kode kernel.

Saat prosesor macet, penghitung waktu akan terus berjalan, sehingga mungkin ada penghitung waktu, atau mungkin ada gangguan dari periferal lain. Jadi saklar konteks lebih mungkin terjadi selama akses memori utama daripada saat akses cache, tetapi hanya karena itu membutuhkan waktu lebih lama.

Meskipun demikian komputer modern memang memasukkan berbagai teknik untuk mencoba mengurangi waktu yang terbuang dalam prosesor menunggu memori utama. Mengulur memang terjadi, tetapi hanya ketika itu tidak bisa dihindari.

Salah satu teknik adalah pengambilan spekulatif : prosesor mencoba menebak lokasi memori mana yang akan diakses, dan mengambilnya ke cache sebelumnya. Misalnya, loop di atas blok memori adalah umum, jadi jika garis cache telah dimuat untuk alamat memori 0x12340000, 0x12340010 dan 0x12340020, mungkin ide yang baik untuk memuat baris untuk 0x12340030. Kompiler dapat membantu dengan membuat instruksi prefetch yang seperti beban kecuali bahwa mereka hanya mentransfer data dari memori utama ke cache, bukan ke register prosesor.

Teknik lain adalah eksekusi spekulatif . Prosesor mulai menjalankan instruksi berikutnya sebelum beban dilakukan. Ini terjadi secara alami karena penyaringan instruksi. Hanya instruksi yang tidak bergantung pada nilai yang dimuat yang dapat dijalankan dengan cara ini: prosesor harus melakukan analisis ketergantungan. Untuk instruksi bersyarat (mis. Memuat r1; cabang jika r1 ≠ 0), prosesor menggunakan heuristik prediksi cabang untuk menebak berapa nilainya. Eksekusi spekulatif setelah suatu beban dapat perlu digulung kembali jika beban memicu pembatalan.

Beberapa arsitektur seperti Itanium memfasilitasi pelaksanaan instruksi dalam urutan yang mudah dengan memungkinkan pemesanan ulang instruksi secara default: alih-alih terdiri dari urutan instruksi dasar yang secara semantik dijalankan satu demi satu, program terdiri dari kata-kata instruksi yang sangat panjang : satu instruksi termasuk banyak operasi yang harus dijalankan secara paralel oleh berbagai komponen prosesor.

Beralih ke utas lain terjadi pada Hyperhreading , ditemukan pada prosesor x86 high-end. Ini adalah teknik desain perangkat keras: setiap inti prosesor berisi dua bank register yang terpisah (masing-masing sesuai dengan konteks tugas), tetapi satu contoh elemen lainnya, sehingga dapat mendukung dua utas eksekusi independen, tetapi hanya secara efektif menjalankan instruksi dari satu sebuah waktu. Sementara satu utas terhenti, utas lainnya berlanjut. Dari sudut pandang perangkat lunak, ada dua prosesor independen; kebetulan bahwa prosesor tersebut berbagi banyak komponen di bawah tenda.

Swap adalah satu level lagi pada hirarki cache memori: memori utama dapat dilihat sebagai cache untuk ruang swap. Dengan bertukar, mekanisme dan rasio kinerja berbeda. Jika suatu tugas membutuhkan data untuk dimuat dari swap, instruksi memuat memicu jebakan yang mengeksekusi kode kernel untuk mengalokasikan halaman dalam RAM dan memuat kontennya dari disk. Ketika ini terjadi, kernel mungkin memutuskan untuk beralih ke tugas lain.


Membandingkan paragraf pertama dan kedua ke terakhir, "trik" adalah bahwa tidak ada perubahan konteks nyata yang perlu terjadi dengan hyperthreading, kan? CPU sepenuhnya mempertahankan dua konteks pada saat yang bersamaan.
Raphael

1
@ Raphael Kanan: sejauh menyangkut perangkat lunak, untuk segalanya kecuali kinerja, ada dua CPU.
Gilles 'SANGAT berhenti menjadi jahat'

CPU hyperthreaded memiliki banyak unit eksekusi semi-independen (integer dan floating point adders, multipliers, dll.), Dan saya pikir kedua konteks dapat menggunakan unit eksekusi terpisah secara bersamaan - tidak 100% yakin tentang hal ini.
Russell Borogove

@RussellBorogove Ya, saya tidak menyebutkan itu karena bahkan CPU non-hyperthreaded dapat memiliki beberapa ALU / FPU / ... dan sebaliknya core yang terpisah kadang-kadang berbagi FPU dll
Gilles 'SO berhenti menjadi jahat'

5

Jawaban untuk pertanyaan ini akan berbeda dengan arsitektur yang dimaksud. Sementara banyak CPU akan macet (ARM, x86 w / o hyperthreading, dll.) Karena butuh waktu terlalu lama untuk mengganti utas, itu bukan pendekatan yang diambil oleh setiap arsitektur. Dalam beberapa arsitektur, setiap utas yang dijadwalkan pada CPU memiliki file register independennya sendiri, sehingga prosesor dapat dengan mudah menjalankan pekerjaan dari utas yang tidak menunggu pada akses memori. Ini adalah pemahaman saya bahwa ini adalah, sampai batas tertentu, apa yang dilakukan x86 hyperthreading (hanya menggunakan 2 utas), tetapi itu jauh lebih umum pada GPGPUarsitektur. Dalam kasus CUDA tertentu, setidaknya lusinan, jika bukan ratusan, lilitan utas biasanya dimuat pada multiprosesor tertentu pada waktu tertentu, dengan setiap utas (ratusan atau ribuan dari mereka) memiliki register sendiri. Ini memungkinkan arsitektur untuk mengeksekusi instruksi dari utas lain pada siklus berikutnya saat utas tertentu mengeluarkan akses memori. Jadi, selama cukup banyak utas dimuat, inti prosesor tidak pernah menganggur untuk mengakses memori. Lihat Pedoman Kinerja dan Hirarki Memori untuk informasi lebih lanjut.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.