Bagaimana cara kerja afinitas prosesor Windows dengan CPU hyperthreaded?

27

Bagaimana cara kerja afinitas prosesor Windows dengan CPU hyperthreaded? Mari kita gunakan contoh (gambar) dari sistem dengan empat core, masing-masing dengan virtual core hyper-threaded.

  1. Inti mana yang sesuai dengan masing-masing "CPU" di bawah ini?
  2. Apakah (katakanlah) CPU 6 dan CPU 7 di bawah ini mewakili satu inti; HT dan inti sesungguhnya?
  3. Jika, misalnya, CPU 6 mewakili inti nyata dan CPU 7 sebuah inti HT, akankah utas yang ditugaskan hanya untuk CPU7 hanya mendapatkan sumber daya sisa dari inti nyata? (dengan asumsi inti menjalankan tugas lain)
  4. Apakah hyperthreading dikelola sepenuhnya di dalam prosesor sedemikian rupa sehingga benang disulap secara internal? Jika demikian, apakah itu pada ruang lingkup CPU atau ruang lingkup inti? Contoh: Jika CPU 6 dan 7 mewakili satu inti, tidak masalah proses mana yang ditugaskan karena CPU akan menetapkan sumber daya yang sesuai untuk thread yang sedang berjalan?
  5. Saya perhatikan bahwa proses single-threaded yang berjalan lama terpental di sekitar core, setidaknya menurut task manager. Apakah ini berarti bahwa menetapkan proses ke satu inti akan meningkatkan kinerja sedikit (dengan menghindari sakelar konteks dan pembatalan cache, dll.)? Jika demikian, dapatkah saya tahu bahwa saya tidak menggunakan "hanya virtual core"?

Ini semua sangat samar dan membingungkan bagi saya. HT memang hebat, tetapi tampaknya mengurangi transparansi alokasi sumber daya.

Menu afinitas prosesor

Charles Burns
sumber
Asal tahu saja, setiap inti CPU yang Anda lihat adalah "inti virtual". Masing-masing memiliki koneksi fisik ke CPU, istilah "virtual" berasal dari bagaimana Windows menjadwalkan proses pada CPU ini, karena implementasi hyperthreading perangkat keras. Lihat jawaban saya untuk lebih jelasnya.
Terobosan
Juga, satu komentar terakhir untuk Anda. "HT itu hebat, tetapi tampaknya mengurangi transparansi alokasi sumber daya." Ini 100% benar, tetapi ada sedikit yang dapat Anda lakukan tentang hal itu, juga tidak ada banyak alasan bagi Anda untuk melakukan sesuatu tentang hal itu. Semua sistem operasi modern tahu apa itu hyperthreading, sebagian besar memiliki penjadwal prosesor canggih untuk mengimbanginya, dan selain dari beberapa kasus tertentu (dan maksud saya sedikit), hampir selalu ada manfaat kinerja.
Terobosan

Jawaban:

18

Inti mana yang sesuai dengan masing-masing "CPU" di bawah ini?

Dengan asumsi kita memiliki Core 1, 2, 3, dan 4, CPU4 dan CPU5 mewakili core 3.

Apakah (katakanlah) CPU 6 dan CPU 7 di bawah ini mewakili satu inti; HT dan inti sesungguhnya?

Tidak ada perbedaan antara keduanya - keduanya memiliki antarmuka perangkat keras fisik ke CPU, antarmuka logis diimplementasikan dalam perangkat keras (lihat Lembar Data Prosesor Intel Core, Volume 1 untuk detail lebih lanjut). Pada dasarnya, setiap inti memiliki dua unit eksekusi yang terpisah, tetapi berbagi beberapa sumber daya yang sama di antara mereka. Inilah sebabnya mengapa dalam kasus-kasus tertentu hyperthreading sebenarnya dapat mengurangi kinerja.

Jika, misalnya, CPU 6 mewakili inti nyata dan CPU 7 sebuah inti HT, akankah utas yang ditugaskan hanya untuk CPU7 hanya mendapatkan sumber daya sisa dari inti nyata? (dengan asumsi inti menjalankan tugas lain)

Lihat di atas. Sebuah thread yang ditugaskan untuk HANYA CPU6 atau HANYA CPU7 akan mengeksekusi pada kecepatan yang sama persis (dengan asumsi thread melakukan pekerjaan yang sama, dan core lain dalam prosesor berada pada idle). Windows tahu tentang prosesor yang mendukung HT, dan penjadwal proses mempertimbangkan hal-hal ini.

Apakah hyperthreaded dikelola sepenuhnya dalam prosesor sedemikian rupa sehingga benang disulap secara internal? Jika demikian, apakah itu pada ruang lingkup CPU atau ruang lingkup inti? Contoh: Jika CPU 6 dan 7 mewakili satu inti, tidak masalah proses mana yang ditugaskan karena CPU akan menetapkan sumber daya yang sesuai untuk thread yang sedang berjalan?

Kedua. Perangkat keras yang sebenarnya itu sendiri tidak menjadwalkan inti untuk menjalankan program, itulah tugas sistem operasi. CPU itu sendiri, bagaimanapun, bertanggung jawab untuk berbagi sumber daya antara unit eksekusi yang sebenarnya, dan Intel menentukan bagaimana Anda dapat menulis kode untuk membuat ini seefisien mungkin.

Saya perhatikan bahwa proses single-threaded yang berjalan lama terpental di sekitar core, setidaknya menurut task manager. Apakah ini berarti bahwa menetapkan proses ke satu inti akan meningkatkan kinerja sedikit (dengan menghindari sakelar konteks dan pembatalan cache, dll.)? Jika demikian, dapatkah saya tahu bahwa saya tidak menggunakan "hanya virtual core"?

Itu adalah perilaku normal, dan tidak, menugaskannya ke satu inti tidak akan meningkatkan kinerja. Yang sedang berkata, jika karena alasan tertentu Anda ingin memastikan satu proses hanya dieksekusi pada inti fisik tunggal, tetapkan ke prosesor logis tunggal.

Alasan proses "terpental" adalah karena penjadwal proses. Ini adalah perilaku normal, dan Anda kemungkinan besar akan mengalami penurunan kinerja dengan membatasi inti apa yang dapat dijalankan oleh proses (terlepas dari berapa banyak utas yang dimilikinya), karena penjadwal proses sekarang harus bekerja lebih keras untuk membuat semuanya berfungsi dengan batasan yang Anda tetapkan. Ya, hukuman ini mungkin dapat diabaikan dalam kebanyakan kasus, tetapi intinya adalah kecuali Anda memiliki alasan untuk melakukan ini, jangan !

Penerobosan
sumber
5

Tata letak CPU seharusnya diatur sehingga sistem operasi yang tidak dapat mengenali semua CPU Anda mendapatkan kinerja semaksimal mungkin. Itu berarti bahwa satu inti virtual dari setiap inti fisik akan didaftar sebelum inti virtual kedua dari inti fisik apa pun terdaftar.

Misalnya, Anda memiliki empat inti berulir yang disebut A, B, C, dan D. Jika Anda menganggap A dan B berbagi cache L2 dan C dan D berbagi cache L2, urutannya harus seperti:
0 = A1 1 = C1 2 = B1 3 = D1 4 = A2 5 = C2 6 = B2 7 = D2

Dengan begitu, sistem operasi yang hanya mengambil dua CPU dapat menggunakan semua cache L2. Juga, sistem operasi yang hanya meraih empat CPU dapat menggunakan semua unit eksekusi.

Sekali lagi, ini memang seharusnya.

Tentu saja, jika Anda menggunakan sistem operasi yang memahami topologi CPU Anda, itu tidak masalah. BIOS mengisi tabel yang menjelaskan core yang berbagi unit eksekusi, yang berbagi cache, dan sebagainya. Setiap sistem operasi modern yang cenderung Anda gunakan yang sepenuhnya mendukung CPU Anda memahami topologi CPU lengkap.

David Schwartz
sumber
1
  1. Cara mereka berhubungan tergantung pada bagaimana CPU & motherboard Anda menghitung dan mengidentifikasi inti. Apa yang seharusnya terjadi adalah bahwa soket fisik dimasukkan terlebih dahulu, inti logis berikutnya, dan inti virtual terakhir. Dalam kasus Anda, core 0-3 haruslah core fisik dan 4-7 core HT virtual. Alasan utama untuk ini adalah jika Anda menjalankan OS yang tidak dapat menangani semua unit eksekusi yang tersedia, kemungkinan besar akan mendapatkan unit yang paling independen terlebih dahulu sebelum yang dibagikan. Tidak akan baik jika hipotetis hanya 2-CPU OS menemukan pasangan HT di sistem Anda, bukan 2 core yang berbeda. (Ini adalah masalah nyata untuk beberapa sistem HT awal, sebelum penjadwal kernel dapat diperbarui untuk CPU baru.)
  2. Lihat 1.
  3. Tidak. HT lebih kompleks dari itu. Ingat bahwa 2 core virtual sering berbagi beberapa sumber daya sementara bit lainnya dipisahkan, tetapi hanya satu atau yang lain yang dapat dieksekusi pada suatu waktu.
  4. Semacam. Contoh Anda (dengan asumsi) umumnya benar. Namun, jika aplikasi dapat mengetahui jenis pekerjaan apa yang sedang berjalan, aplikasi ini dapat membantu utas jadwal OS dengan tepat.
  5. Ada alasan yang sangat bagus untuk loncatan inti: Menyebarkan beban kerja termal sekitar. Mengingat bahwa dalam banyak kasus, cache level yang lebih tinggi (L2, L3) dibagi di semua core, core hopping tidak akan memiliki dampak kinerja yang signifikan, tetapi dampak termal akan signifikan karena Anda tidak akan memiliki "hot spot" di satu inti yang terus berjalan sementara yang lain diam. Sekarang, crossing socket dalam sistem multi-socket (khususnya sistem NUMA) dapat memiliki dampak kinerja yang signifikan. Sebagian besar penjadwal menyadari hal ini dan mempertimbangkannya.

Pada akhirnya, intinya adalah bahwa sering kali hanya sedikit yang dapat Anda lakukan (sebagai pengguna akhir) dengan afinitas utas untuk secara signifikan memengaruhi kinerja selain memastikan bahwa Anda menjalankan OS terbaru yang mengetahui berbagai bit dalam sistem anda.

Jika Anda menemukan beban kerja di mana secara manual menetapkan afinitas memiliki dampak signifikan, laporkan sebagai bug kepada pengembang aplikasi sehingga program dapat diperbaiki.

afrazier
sumber
4
"core 0-3 harus core fisik dan 4-7 core HT virtual" Sebenarnya, inti 0 dan inti 1 berhubungan dengan inti fisik (tunggal) yang sama. Setiap "inti ber-hiphread" memiliki dua koneksi fisik ke CPU, sehingga Windows benar-benar melihat 8 core fisik. Itu hanya tahu bahwa CPU memiliki hyperthreading. Lihat lembar data Intel Core untuk detail lebih lanjut tentang ini jika Anda tertarik.
Terobosan
@Breakthrough Itu tidak akan menjadi topologi yang baik karena itu berarti bahwa OS naif yang hanya mendukung 4 core akan berakhir hanya menggunakan setengah dari core fisik. Satu inti virtual dari setiap inti fisik akan muncul dalam daftar inti virtual sebelum inti virtual kedua dari inti fisik apa pun terdaftar.
David Schwartz
@ DavidSchwartz Topologi yang baik atau tidak, begitulah prosesor logis menyebutkan. Oleh karena itu sangat disarankan untuk menonaktifkan hyperthreading pada OS awal (misalnya Windows 2000 dan sebelumnya) yang tidak menghitung dengan benar piringan hitam vs inti vs paket CPU fisik.
Jamie Hanrahan