Apa artinya "rep; tidak; ” berarti dalam perakitan x86? Apakah sama dengan instruksi "jeda"?

86
  • Apa rep; nopmaksudnya
  • Apakah itu sama dengan pauseinstruksi?
  • Apakah sama dengan rep nop(tanpa titik koma)?
  • Apa bedanya nopinstruksi sederhana ?
  • Apakah itu berperilaku berbeda pada prosesor AMD dan Intel?
  • (bonus) Di manakah dokumentasi resmi untuk instruksi ini?

Motivasi untuk pertanyaan ini

Setelah beberapa diskusi di komentar dari pertanyaan lain , saya menyadari bahwa saya tidak tahu apa rep; nop;artinya dalam perakitan x86 (atau x86-64). Dan juga saya tidak dapat menemukan penjelasan yang bagus di web.

Saya tahu itu repadalah awalan yang berarti "ulangi instruksi cxkali berikutnya " (atau setidaknya itu, dalam perakitan x86 16-bit lama). Menurut ini tabel ringkasan di Wikipedia , tampaknya rephanya dapat digunakan dengan movs, stos, cmps, lods, scas(tapi mungkin keterbatasan ini telah dihapus pada prosesor yang lebih baru). Jadi, saya akan berpikir rep nop(tanpa titik koma) akan mengulangi waktu nopoperasi cx.

Namun, setelah mencari lebih jauh, saya semakin bingung. Tampaknya rep; nopdan pause memetakan ke opcode yang persis sama , dan pausememiliki perilaku yang sedikit berbeda dari sekadar nop. Beberapa surat lama dari tahun 2005 mengatakan hal yang berbeda:

  • "cobalah untuk tidak membakar terlalu banyak tenaga"
  • "Ini setara dengan 'nop' hanya dengan pengkodean 2 byte."
  • "Ini sihir bagi intel. Ini seperti 'nop tapi biarkan saudara HT lainnya lari'"
  • "Ini adalah jeda pada intel dan padding cepat di Athlon"

Dengan pendapat yang berbeda ini, saya tidak dapat memahami arti yang benar.

Ini digunakan di kernel Linux (di i386 dan x86_64 ), bersama dengan komentar ini: /* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */Ini juga digunakan di BeRTOS , dengan komentar yang sama.

Denilson Sá Maia
sumber

Jawaban:

75

rep; nop memang sama dengan pause instruksi (opcode F390). Ini mungkin digunakan untuk assembler yang belum mendukung pauseinstruksi. Pada prosesor sebelumnya, ini tidak melakukan apa-apa, sama seperti noptetapi dalam dua byte. Pada prosesor baru yang mendukung hyperthreading, ini digunakan sebagai petunjuk bagi prosesor bahwa Anda menjalankan spinloop untuk meningkatkan kinerja. Dari referensi instruksi Intel :

Meningkatkan kinerja putaran tunggu. Saat menjalankan "spin-wait loop", prosesor Pentium 4 atau Intel Xeon mengalami penalti performa yang parah saat keluar dari loop karena mendeteksi kemungkinan pelanggaran urutan memori. Instruksi PAUSE memberikan petunjuk kepada prosesor bahwa urutan kode adalah putaran-tunggu loop. Prosesor menggunakan petunjuk ini untuk menghindari pelanggaran urutan memori di sebagian besar situasi, yang sangat meningkatkan kinerja prosesor. Untuk alasan ini, disarankan agar instruksi PAUSE ditempatkan di semua putaran tunggu.

ughoavgfhw.dll
sumber
4
Apakah loop spin-wait sama dengan loop busy-wait ? Apakah "perbaikan" ini hanya berlaku untuk prosesor hyperthreading? (dan mengapa?)
Denilson Sá Maia
11
Ya, loop spin-wait sama dengan loop busy-wait. Manfaatnya juga berlaku untuk CPU yang tidak mendukung hyper-threading. Ini dapat dianggap sebagai membatasi jumlah instruksi (yang tidak perlu) dalam pipa (daripada mencoba melakukan banyak iterasi loop secara paralel)
Brendan
1
@ Brendan, terima kasih! Saya tidak mengerti sama sekali, sampai Anda mengatakan hal tentang iterasi loop secara paralel.
Prof. Falken
11
@ Brendan, Oh, sekarang saya mengerti! Prosesor modern ini adalah superscalar , dan karenanya mereka akan mencoba menjalankan beberapa instruksi pada saat yang bersamaan. Jika ini adalah loop tunggu sibuk, menjalankan lebih banyak instruksi tidak akan membuatnya lebih cepat, karena hanya menunggu kondisi lain.
Denilson Sá Maia
1
@Denilson: Ya, hyperthreading-friendliness (atau hanya hemat daya tanpa HT) adalah satu manfaat besar, tetapi yang lain adalah menghindari kesalahan spekulasi pengurutan memori saat meninggalkan putaran-putaran. Tanpanya pause, spin-loop Anda secara efektif satu pipeline-clear lebih lambat untuk memperhatikan perubahan status lokasi memori yang ditulis oleh inti lain.
Peter Cordes
15

rep nop= F3 90 = pengkodean pause, serta cara menerjemahkannya pada CPU lama yang tidak mendukung pause.


Awalan (selain lock) yang tidak berlaku untuk instruksi diabaikan dalam praktiknya oleh CPU yang ada.

Dokumentasi mengatakan penggunaan repdengan instruksi yang tidak berlaku untuk "dicadangkan dan dapat menyebabkan perilaku tak terduga" karena CPU di masa mendatang mungkin mengenalinya sebagai bagian dari beberapa instruksi baru. Setelah mereka membuat pengkodean instruksi baru yang spesifik menggunakan f3 xx, mereka mendokumentasikan bagaimana itu berjalan pada CPU lama. (Ya, ruang opcode x86 sangat terbatas sehingga mereka melakukan hal-hal gila seperti ini, dan ya itu membuat decoder menjadi rumit.)

Dalam hal ini, itu berarti Anda dapat menggunakan pausespinloop tanpa melanggar compat mundur . CPU lama yang tidak tahu tentang pauseakan mendekodekannya sebagai NOP tanpa kerusakan, seperti yang dijamin oleh entripause manual referensi ISA Intel untuk . Pada CPU baru, Anda mendapatkan manfaat dari hemat daya / keramahan HT, dan menghindari kesalahan spekulasi pengurutan memori saat memori yang Anda putar berubah dan Anda meninggalkan putaran putaran.


Tautan ke manual Intel dan banyak hal bagus lainnya di halaman info wiki tag x86

Kasus lain dari repawalan yang tidak berarti menjadi instruksi baru pada CPU baru: lzcntadalah F3 0F BD /r. Pada CPU yang tidak mendukung instruksi itu (tidak memiliki tanda fitur LZCNT di CPUID-nya), ia mendekode sebagai rep bsr, yang berjalan sama dengan bsr. Jadi pada CPU lama, ia menghasilkan 32 - expected_result, dan tidak ditentukan saat inputnya nol.

Tetapi tzcntdan bsfmelakukan hal yang sama dengan input bukan nol, sehingga kompiler dapat dan memang menggunakan tzcntmeskipun tidak ada jaminan bahwa CPU target akan menjalankannya sebagai tzcnt. CPU AMD memiliki kecepatan yang cepat tzcnt, lambat bsf, dan pada Intel keduanya juga cepat. Selama tidak masalah kebenarannya (Anda tidak bergantung pada pengaturan bendera, atau meninggalkan tujuan tujuan yang tidak dimodifikasi dalam kasus input = 0), membuatnya didekode seperti tzcntpada CPU yang mendukungnya akan sangat membantu.


Salah satu kasus repawalan yang tidak berarti yang mungkin tidak akan pernah didekode secara berbeda: rep retdigunakan secara default oleh gcc saat menargetkan CPU "generik" (yaitu tidak menargetkan CPU tertentu dengan -marchatau -mtune, dan tidak menargetkan AMD K8 atau K10.) Ini akan memakan waktu puluhan tahun sebelum siapa pun dapat membuat CPU yang menerjemahkan kode rep retselain ret, karena ia ada di sebagian besar binari di sebagian besar distro Linux. Lihat Apa arti `rep ret`?

Peter Cordes
sumber
3
The repprefix juga digunakan oleh Intel untuk menambahkan kunci penghilangan bunyi dlm percakapan.
Paul A. Clayton
Awalan yang tidak berlaku untuk instruksi akan diabaikan. Tetapi disebutkan bahwa Repeat Prefixes ( F2Hdan F3H) Dicadangkan dan dapat mengakibatkan perilaku yang tidak dapat diprediksi pada Tabel 11-3. Pengaruh Awalan pada Instruksi SSE, SSE2, dan SSE3 . Jadi aplikasi awalan diabaikan untuk beberapa instruksi, tidak untuk semua. Jadi, apakah fitur ini dianggap tidak berdokumen?
St. Antario
2
@ St. Antario: Mereka mengucapkannya seperti itu karena CPU di masa mendatang mungkin mengenalinya sebagai bagian dari beberapa instruksi baru. Pada semua CPU nyata yang terjadi, dan setelah mereka membuat pengkodean menggunakan f3 xxmereka mendokumentasikan bagaimana itu berjalan pada CPU yang lebih lama.
Peter Cordes
1
Awalan (selain kunci) yang tidak berlaku untuk instruksi diabaikan dalam praktiknya oleh CPU yang ada. rep movbePenyebabnya didokumentasikan #UD, jadi reptidak selalu diabaikan. Bahkan jika itu tidak berlaku untuk instruksi dalam arti seperti yang ditentukan dalam REP/REPE/REPZ/REPNE/REPNZentri manual.
St. Antario
2
@ St.Antario: Menarik! Namun secara umum, untuk instruksi yang lebih lama, awalan yang tidak dapat diterapkan diabaikan. Saat memperkenalkan instruksi baru, dimungkinkan untuk menambahkan aturan yang lebih ketat jika mereka mau. IDK mengapa mereka akan memilih itu untuk kasus khusus ini.
Peter Cordes