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?
computer-architecture
cpu-cache
cpu-pipelines
102948239408
sumber
sumber
Jawaban:
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.)
sumber
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.
sumber
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.
sumber