Rumah  >  Artikel  >  Tutorial sistem  >  Mengoptimumkan prestasi pada tahap saluran paip x86

Mengoptimumkan prestasi pada tahap saluran paip x86

WBOY
WBOYke hadapan
2024-01-03 18:32:261148semak imbas
Pengenalan Bagaimana untuk memilih jalan yang betul apabila menghadapi dahan? Jika pemilihan arahan adalah salah, keseluruhan saluran paip perlu menunggu arahan yang selebihnya dilaksanakan, mengosongkannya, dan kemudian mulakan semula dari kedudukan yang betul. Semakin dalam tahap saluran paip, semakin besar kerosakan yang berlaku.
Kata Pengantar

Pengoptimuman prestasi, kuncinya adalah untuk melayani CPU dengan baik. Sebagai pengaturcara yang mengejar prestasi terbaik, memahami mekanisme dalaman CPU adalah topik yang tidak dapat dielakkan. Ini adalah proses berterusan yang memerlukan pengumpulan dari semasa ke semasa, tetapi ia tidak perlu mendalami litar digital Sama seperti pakar dalam mereka bentuk CPU tidak semestinya mahir dalam reka bentuk perisian, anda tidak perlu menjadi pakar CPU. untuk menulis perisian berprestasi tinggi.

Sebagai hadiah berharga daripada sekumpulan kecil elit manusia kepada masyarakat umum, CPU yang boleh dibeli sesuka hati di pasaran sebenarnya mewakili tahap teknologi manusia yang paling canggih seperti senjata nuklear yang tidak boleh dibeli. Malah pakar CPU x86 hanya boleh bercakap secara terperinci tentang apa yang dia pakar. Bagi kami, walaupun mustahil untuk memahami segala-galanya, terdapat tiga bahagian yang sangat kritikal: saluran paip, cache dan set arahan. Di antara ketiga-tiga bahagian ini, "garisan pemasangan" boleh digunakan sebagai petunjuk berjalan. Oleh itu, mengikut contoh dari artikel sebelumnya, mari kita lihat saluran paip dahulu.
Konsep asas

Tugas utama PU ialah melaksanakan operasi pada data mengikut arahan. Ayat ini pada asasnya menerangkan apa itu barisan pemasangan. Saya tahu bahawa tiada siapa yang boleh mengklik pada artikel ini tahu apa-apa tentang konsep "garis pemasangan". Saya tidak mahu meletakkan teks seperti buku teks pada permulaan dan menyenaraikan definisi pelbagai konsep Tinggalkan perkara asas dengan sepenuh hati dan kejar yang lemah. Perkembangan teknologi hanyalah satu bentuk pergerakan percanggahan dalam perkara Kali ini kita akan cuba memperkenalkan pelbagai komponen saluran paip dari perspektif evolusi sejarah CPU.

Dari masa Intel menghasilkan pemproses 8086 pertama 40 tahun yang lalu sehingga hari ini, perubahan dalam CPU telah membuatkan anda merasakan bahawa pemproses terdahulu hanya boleh dipanggil "komputer cip tunggal." Tetapi walaupun ia adalah mikrokomputer cip tunggal yang hanya berharga beberapa sen sekeping di Taobao, ia masih mempunyai beberapa persamaan dengan pemproses i7 hari ini. Pemproses 8086 mempunyai 14 daftar yang masih digunakan hari ini: 4 daftar tujuan umum (Daftar Tujuan Umum), 4 daftar segmen (Daftar Segmen), 4 daftar indeks (Daftar Indeks), dan 1 daftar bendera (Daftar EFLAGS) Ia digunakan untuk menandakan status CPU, dan yang terakhir, Daftar Penunjuk Arahan, digunakan untuk menyimpan alamat arahan seterusnya yang perlu dilaksanakan. Daftar penunjuk arahan ini berkaitan secara langsung dengan proses operasi saluran paip Kewujudannya yang berterusan juga menunjukkan ketekalan masa prinsip asas saluran paip.

Dari 40 tahun yang lalu hingga sekarang, semua arahan yang dilaksanakan oleh CPU mengikut proses berikut: CPU mula-mula memperoleh (Ambil) alamat arahan yang akan dilaksanakan dalam segmen kod berdasarkan penunjuk arahan, dan kemudian menyahkod (Nyahkod ) arahan di alamat. Selepas penyahkodan, ia akan memasuki fasa pelaksanaan sebenar (Execute), diikuti dengan fasa "Write Back", di mana hasil akhir pemprosesan akan ditulis semula ke memori atau daftar, dan daftar penunjuk arahan akan dikemas kini ke titik kepada arahan seterusnya. Ini pada asasnya adalah penyelesaian reka bentuk yang benar-benar konsisten dengan logik manusia.

Pada mulanya, dan secara semula jadi, CPU akan memproses semua arahan satu demi satu. Setiap arahan dilaksanakan mengikut proses di atas, dan kemudian arahan seterusnya dilaksanakan. Percanggahan utama pada masa itu ialah percanggahan antara keperluan prestasi perisian yang semakin meningkat dan kelajuan pemprosesan CPU yang mundur. Di bawah bimbingan Undang-undang Moore yang betul, kerja pembinaan CPU telah mencapai keputusan bersejarah, dan percanggahan utama telah beralih: kelajuan pelaksanaan CPU perlahan-lahan melebihi kelajuan membaca dan menulis memori. Oleh itu, pengambilan arahan dari ingatan setiap kali menjadi semakin tidak tertanggung, jadi pada tahun 1982, cache arahan telah diperkenalkan dalam pemproses.

Apabila CPU menjadi lebih pantas dan pantas, cache data juga diperkenalkan ke dalam pemproses sebagai kompromi antara dua pihak yang bercanggah. Tetapi ini bukan penyelesaian kekal. Aspek utama percanggahan ialah CPU tidak berjalan pada tepu. Jadi pada tahun 1989, pemproses i486 secara konstruktif memperkenalkan saluran paip lima peringkat. Ideanya adalah untuk mencerna lebihan kapasiti CPU dengan merangsang permintaan domestik: daripada memproses hanya satu arahan pada satu masa, ia boleh memproses lima arahan pada satu masa.

Mengoptimumkan prestasi pada tahap saluran paip x86

Daripada tahap saluran paip x86, mari bercakap tentang cara mengoptimumkan prestasi

Saya tidak tahu apa yang anda fikirkan, tetapi saya sentiasa menghadapi kesukaran untuk memahami gambar ini. Untuk memberikan pemahaman mudah: bayangkan setiap arahan sebagai produk yang akan diproses, mengalir ke dalam barisan pemasangan dengan 5 langkah pemprosesan. Ini membolehkan setiap proses CPU sentiasa mengekalkan beban kerja tepu, yang secara asasnya meningkatkan daya pemprosesan arahan dan prestasi program.
Masalah yang diperkenalkan oleh barisan pemasangan

Jika anda hanya mengabstrak setiap baris kod ke dalam arahan XOR, mengikut rajah saluran paip i486 di atas, arahan pertama memasuki peringkat Ambil saluran paip, dan kemudian memasuki peringkat D1, pada masa itu arahan kedua memasuki Ambil. Pada kitaran mesin seterusnya, arahan pertama masuk ke D2, yang kedua ke D1, dan arahan ketiga adalah Diambil. Setakat ini semuanya adalah normal, tetapi dalam kitaran mesin seterusnya, apabila arahan pertama memasuki peringkat Laksanakan, arahan kedua tidak boleh terus memasuki peringkat seterusnya, kerana hasil akhir pembolehubah a yang diperlukannya mestilah pada peringkat pertama Ia hanya boleh diperoleh selepas arahan dilaksanakan. Oleh itu, arahan kedua akan disekat pada saluran paip dan tidak akan diteruskan sehingga arahan pertama selesai. Semasa pelaksanaan arahan kedua, arahan ketiga akan mempunyai pertemuan yang sama. Apabila penyekatan saluran paip berlaku, pelaksanaan arahan saluran paip akan dipisahkan daripada pelaksanaan individu, yang dipanggil saluran paip "gelembung".

Kitaran jam: juga dipanggil kitaran ayunan. Ia adalah timbal balik frekuensi jam (frekuensi utama) dan tempoh masa minimum
Kitaran mesin: Setiap peringkat dalam saluran paip dipanggil operasi asas, dan masa yang diperlukan untuk menyelesaikan operasi asas ialah kitaran mesin
Kitaran arahan: masa yang diperlukan untuk melaksanakan arahan, biasanya terdiri daripada berbilang kitaran mesin

Selain situasi di atas, terdapat satu lagi sebab biasa untuk penjanaan buih. Masa yang diperlukan untuk melaksanakan setiap arahan (kitaran arahan) adalah berbeza. Apabila arahan mudah didahului dengan arahan kompleks yang mengambil masa yang lama, arahan mudah perlu menunggu arahan kompleks. Tambahan pula kalau ada cawangan macam kalau dalam program? Situasi ini akan menyebabkan saluran paip tidak dapat berfungsi pada kapasiti penuh, mengakibatkan penurunan relatif dalam prestasi.

Apabila berhadapan dengan masalah, orang sentiasa cenderung untuk memperkenalkan mekanisme yang lebih kompleks untuk menyelesaikan masalah Barisan pemasangan berbilang peringkat adalah contoh. Kerumitan boleh mencerminkan peningkatan teknologi, tetapi "kerumitan" itu sendiri adalah masalah baharu. Inilah sebabnya mengapa percanggahan tidak akan hilang dan teknologi tidak akan berhenti berkembang. Tetapi "semakin banyak kita belajar, lebih banyak kita kalah untuk Tao Mekanisme yang semakin kompleks akan sentiasa mempunyai kejayaan besar pada masa tertentu, tetapi mungkin masanya belum tiba." Menghadapi masalah "gelembung", pemproses memperkenalkan penyelesaian yang lebih kompleks-apabila Intel mengeluarkan pemproses Pentium Pro pada tahun 1995, ia menambah teras yang tidak tertib (teras OOO).

Teras pelaksanaan luar biasa (teras OOO)

Malah, idea pelaksanaan luar biasa adalah sangat mudah: apabila arahan seterusnya disekat, cari sahaja arahan boleh laku lain daripada arahan berikut. Tetapi menyelesaikan ini agak rumit. Pertama sekali, adalah perlu untuk memastikan bahawa hasil akhir program adalah konsisten dengan pelaksanaan berurutan, dan pada masa yang sama, pelbagai kebergantungan data mesti dikenal pasti. Untuk mencapai kesan yang diingini, sebagai tambahan kepada pelaksanaan selari, butiran arahan juga perlu diperhalusi untuk mencapai kesan tanpa menggunakan ketebalan untuk mencapai kesan yang diingini Dengan cara ini, "operasi mikro" (operasi mikro , μ-ops) diperkenalkan. Dalam peringkat Decode saluran paip, arahan pemasangan dibongkar lagi, dan produk akhir ialah satu siri operasi mikro.

Memperkenalkan aliran pemprosesan μ-ops arahan selepas teras pemprosesan yang tidak mengikut pesanan. Modul warna berbeza sepadan dengan peringkat pemprosesan saluran paip berwarna berbeza dalam gambar pertama.

Tidak banyak perubahan dalam peringkat Ambil Dalam peringkat Nyahkod, empat arahan boleh dinyahkod secara selari, dan produk akhir penyahkodan ialah μ-ops yang dinyatakan di atas. Jadual Alias ​​Daftar berikut dan Penampan Susun Semula boleh dianggap sebagai peringkat prapemprosesan teras pelaksanaan yang tidak tertib.

Untuk operasi mikro yang dilaksanakan secara selari, atau operasi yang dilaksanakan tidak teratur, kemungkinan besar daftar yang sama akan dibaca dan ditulis pada masa yang sama. Oleh itu, dalam pemproses, daftar asal "dialiasikan" sebagai daftar dalaman yang tidak dapat dilihat oleh jurutera perisian, supaya operasi yang asalnya dilakukan pada daftar yang sama boleh dilakukan pada daftar yang berbeza buat sementara waktu, tanpa mengira Membaca dan menulis tidak mengganggu setiap lain (nota: ini memerlukan kedua-dua operasi tidak mempunyai kebergantungan data). Operan operasi mikro yang sepadan juga telah ditukar kepada daftar alias sementara, yang bersamaan dengan strategi ruang untuk masa, dan pada masa yang sama, arahan mikro diterjemahkan berdasarkan daftar alias.

Kemudian operasi mikro memasuki Penampan Susun Semula. Pada ketika ini, arahan mikro sudah sedia. Mereka dimasukkan ke dalam Stesen Tempahan(RS) dan dilaksanakan secara selari. Daripada rajah anda boleh melihat beberapa unit pelaksanaan (Port X). Setiap unit pelaksanaan melaksanakan tugas tertentu, seperti membaca (Muat), menulis (Simpan), pengiraan integer (ALU, LIHAT), dsb. Setiap arahan mikro yang berkaitan boleh dilaksanakan selepas data yang diperlukannya sedia. Walaupun arahan dan arahan yang memakan masa yang lama dengan kebergantungan data tidak mempunyai perubahan dari perspektif mereka sendiri, overhed penyekatan yang mereka bawa diimbangi oleh keselarian dan keterlaluan (advance) bagi titik pelaksanaan berikutnya dilunaskan dan dipecahkan bahagian, dengan itu meningkatkan daya pengeluaran keseluruhan.

Keajaiban teras pelaksanaan yang tidak teratur ialah ia dapat memaksimumkan kecekapan mekanisme ini, dan dari dunia luar, arahan dilaksanakan dengan teratur. Butiran terperinci adalah di luar skop artikel ini. Tetapi teras pelaksanaan yang tidak mengikut urutan sangat berjaya sehinggakan walaupun di bawah beban kerja yang besar, teras pelaksanaan yang tidak mengikut urutan CPU yang memperkenalkan mekanisme ini masih akan melahu pada kebanyakan masa dan jauh dari tepu. Oleh itu, satu lagi bahagian hadapan (Front-end, termasuk Fetch and Decode) diperkenalkan untuk menyampaikan μ-ops ke teras Dari perspektif sistem, ia boleh disarikan kepada dua teras pemprosesan, iaitu Hyper-thread N teras fizikal dan teras logik 2N.

Pelaksanaan di luar pesanan tidak semestinya mencapai kesan pelaksanaan kod berjujukan 100%. Kadangkala pengaturcara perlu memperkenalkan halangan memori untuk memastikan susunan pelaksanaan.

Tetapi perkara yang kompleks sentiasa memperkenalkan masalah baru kali ini percanggahan telah dipindahkan ke peringkat Fetch. Bagaimana untuk memilih jalan yang betul apabila menghadapi cawangan? Jika pemilihan arahan adalah salah, keseluruhan saluran paip perlu menunggu arahan yang selebihnya dilaksanakan, mengosongkannya, dan kemudian mulakan semula dari kedudukan yang betul. Semakin dalam tahap saluran paip, semakin besar kerosakan yang berlaku. Artikel seterusnya akan memperkenalkan beberapa kaedah pengoptimuman pada peringkat pengaturcaraan.
Pengenalan pengarang

Zhang Pan, seorang jurutera rangkaian Yunshan, menumpukan pada pembangunan dan pengoptimuman prestasi perisian rangkaian x86 Beliau terlibat secara mendalam dalam organisasi dan komuniti seperti ONF/OPNFV/ONOS. Beliau pernah berkhidmat sebagai naib pengerusi kumpulan kerja ujian ONF.

Atas ialah kandungan terperinci Mengoptimumkan prestasi pada tahap saluran paip x86. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:linuxprobe.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam