Instruksi latensi CPU pada prosesor x86 dan x64

13

Saya mencari beberapa tabel atau yang serupa yang dapat membantu saya menghitung efisiensi kode assembly.

Seperti yang saya ketahui, bit shifting membutuhkan 1 jam CPU, tetapi saya benar-benar melihat berapa banyak yang membutuhkan penambahan (pengurangan harus sama), perkalian dan bagaimana mungkin menghitung waktu pembagian jika saya tahu nilai yang membagi.

Saya benar-benar membutuhkan info tentang nilai integer, tetapi waktu eksekusi float juga diterima.

ST3
sumber
Kemungkinan sama pada SO: stackoverflow.com/questions/692718/…
Ciro Santilli 冠状 病毒 审查 六四 六四 事件 法轮功

Jawaban:

9

Secara umum, masing-masing operasi ini membutuhkan satu siklus clock tunggal juga untuk mengeksekusi jika argumen ada di register pada berbagai tahap pipa.

Apa yang Anda maksud dengan latensi? Berapa banyak siklus yang dihabiskan operasi dalam ALU?

Anda mungkin menemukan tabel ini berguna: http://www.agner.org/optimize/instruction_tables.pdf

Karena prosesor modern super skalar dan dapat berjalan di luar urutan, Anda sering dapat memperoleh instruksi total per siklus yang melebihi 1. Argumen untuk perintah makro adalah yang paling penting, tetapi operasi juga penting karena pembagian membutuhkan waktu lebih lama daripada XOR (<1 siklus latensi).

Banyak instruksi x86 dapat mengambil banyak siklus untuk menyelesaikan beberapa tahapan jika kompleks (misalnya, perintah REP atau MWAIT yang lebih buruk).

Jon Brauer
sumber
3
Multiper integer setidaknya 3c latensi pada semua CPU x86 terbaru (dan lebih tinggi pada beberapa CPU yang lebih tua). Pada banyak CPU itu sepenuhnya pipelined, jadi throughput adalah 1 per jam, tetapi Anda hanya dapat mencapainya jika Anda memiliki tiga penggandaan independen dalam penerbangan. (Multiply FP pada Haswell adalah 5c latency, throughput 0,5c, jadi Anda perlu 10 dalam penerbangan untuk memenuhi throughput). Divisi ( divdan idiv) bahkan lebih buruk: ini diberi kode mikro, dan latensi jauh lebih tinggi daripada addatau shr, dan bahkan tidak sepenuhnya disalurkan melalui CPU. Semua ini langsung dari tabel instruksi Agner Fog, jadi ada baiknya Anda menghubungkannya.
Peter Cordes
Lihat juga Mengapa kode C ++ ini lebih cepat daripada rakitan tulisan tangan saya untuk menguji dugaan Collatz? untuk lebih lanjut tentang mengoptimalkan ASM.
Peter Cordes
7

Menghitung efisiensi kode perakitan bukanlah cara terbaik untuk pergi di hari-hari ini dari jaringan pipa Super Scalar Out of Order. Ini akan bervariasi berdasarkan jenis prosesor. Ini akan bervariasi pada instruksi sebelum dan sesudahnya (Anda dapat menambahkan kode tambahan dan membuatnya kadang-kadang berjalan lebih cepat!). Beberapa operasi (divisi khususnya) dapat memiliki rentang waktu eksekusi bahkan pada chip yang lebih lama dapat diprediksi. Sebenarnya waktu banyak iterasi adalah satu-satunya cara untuk pergi.

Brian Knoblauch
sumber
Saya tahu itu, tetapi saya membutuhkannya bukan dalam proyek nyata tetapi dalam satu jenis proyek pemrograman yang menyenangkan .
ST3
Apakah Anda memerlukannya untuk nyata atau untuk bersenang-senang tidak mengubah jawaban untuk lini prosesor ini. Sudahkah Anda mempertimbangkan beralih ke prosesor yang lebih deterministik, seperti chip Propeller?
Brian Knoblauch
3
Bahkan dengan skalar, mispiksi implementasi in-order dan misses cache bisa menyebabkan variasi dalam waktu berjalan.
Paul A. Clayton
Untuk hal-hal yang murni terikat pada CPU (tidak ada cache yang hilang, tidak ada kesalahan prediksi cabang), perilaku CPU dipahami secara cukup rinci sehingga analisis statis sering dapat memprediksi dengan tepat berapa banyak siklus per iterasi yang akan diambil oleh sebuah loop pada CPU tertentu (mis. Intel Haswell). mis. lihat jawaban SO ini ketika melihat pada asm yang dihasilkan oleh compiler, saya jelaskan mengapa versi bercabang berjalan hampir persis 1,5x lebih cepat daripada versi CMOV pada OP Sandybridge CPU, tetapi lebih dekat pada Skylake saya.
Peter Cordes
Jika Anda menulis asm dengan tangan untuk alasan kinerja, maka sebenarnya berguna untuk mencari hambatan latensi dan throughput pada Intel dan AMD CPU. Namun, ini sulit, dan terkadang yang optimal untuk AMD bukanlah yang optimal untuk Intel.
Peter Cordes
4

Anda dapat menemukan informasi tentang cpu intel di manual pengembang perangkat lunak intel . Misalnya latensi adalah 1 siklus untuk penambahan bilangan bulat dan 3 siklus untuk perkalian bilangan bulat.

Saya tidak tahu tentang multiplikasi, tetapi saya berharap penambahan selalu mengambil satu siklus.

UmNyobe
sumber
Satu siklus, kecuali saat "bebas" (secara paralel ketika saluran pipa berbaris dengan benar) atau membutuhkan waktu lebih lama karena ada cache yang ketinggalan. :-)
Brian Knoblauch
2
Saat ini (2018) informasi ini tersedia dalam Lampiran C bernama "Latensi Instruksi dan Throughput" dokumen 248966 "Intel® 64 dan IA-32 Architecture Reference Optimization Reference Manual" juga tersedia pada halaman yang terhubung dalam jawaban
stefanct