Bagaimana cara mengatur afinitas prosesor pada OS X?

17

Bagaimana Anda mengatur afinitas prosesor di Snow Leopard pada MacBook Pro? Saya tahu di Windows Anda bisa mengaktifkannya di Task Manager.

Troggy
sumber
2
<snarky-comment> Jalankan OS X di mesin virtual, dan atur afinitas mesin virtual </snarky-comment>
zildjohn01
Mengapa Anda ingin melakukan ini? Ini umumnya ide yang buruk kecuali jika Anda mencoba menjalankan program lama yang sangat buruk kodenya rusak pada sistem multicore.
jalf
2
@jalf: afinitas prosesor dapat meningkatkan kinerja karena mengurangi pembatalan cache & trashing dalam beberapa kasus.
1
Itu mengecewakan. Sepertinya Mac tidak akan pernah menjadi platform ideal untuk pengembangan perangkat lunak real-time.
Evan Plaice
1
@jweyrich Pengecualian dalam CPU dengan QPI (Intel NUMA) seperti pada Mac Pro, di mana pengaturan afinitas CPU menonaktifkan afinitas memori dan menurunkan kinerja. Ini tidak berlaku untuk prosesor seluler.
Jano

Jawaban:

14

OS X telah mendukung API afinitas utas sejak versi 10.5. Berikut adalah beberapa materi yang relevan dari halaman web yang saya tautkan.

Set Affinity

Set afinitas adalah kumpulan utas yang berbagi sumber daya memori dan ingin berbagi cache L2. Set afinitas yang berbeda mewakili afinitas yang terpisah — yaitu, utas yang berasal dari set yang berbeda harus menggunakan cache L2 yang terpisah dan karenanya dijalankan pada prosesor logis yang berbeda.

Set afinitas diidentifikasi oleh "tag". Utas diberikan ke set afinitas tertentu dengan memberinya tag yang mengidentifikasi set itu. Sebuah thread dapat dimiliki paling banyak satu set afinitas; yaitu, ia memiliki satu tag afinitas.

Pengaruh Pengaturan Tag Affinity Berbeda

Misalnya, aplikasi yang ingin menjalankan 2 utas pada cache L2 yang terpisah akan menetapkan utas dengan tag afinitas yang berbeda. Pada mesin dual core, afinitas ini secara efektif akan diabaikan. Namun, pada MacPro 4-inti, penjadwal akan mencoba menjalankan utas pada paket terpisah. Demikian pula, pada MacPro 8-inti, penjadwal akan mencoba menjalankan utas ini pada dies yang terpisah (yang mungkin atau mungkin tidak ada dalam paket CPU fisik yang sama).

Contoh Penggunaan

Aplikasi yang ingin menempatkan utas pada setiap prosesor yang tersedia akan melakukan hal berikut:

  • Dapatkan jumlah prosesor pada sistem menggunakan sysctl (3).
  • Buat jumlah utas itu.
  • Atur setiap utas dengan tag afinitas yang berbeda.
  • Mulai semua utas.

Utas dengan kebijakan afinitas default akan dijadwalkan lebih bebas pada prosesor apa pun. Utas ini akan dimigrasikan secara istimewa untuk dijalankan pada prosesor yang menganggur. Utas dengan tag afinitas akan cenderung tetap di tempatnya.

Konsultasikan dengan sumber untuk daftar kode, dan informasi tentang berbagi tag afinitas antara proses induk dan anak, mendapatkan konfigurasi cache CPU, dan banyak lagi.

batal-pointer
sumber
Apakah ada utilitas commandline, selain API ini?
Victor Eijkhout
11

http://developer.apple.com/mac/library/releasenotes/Performance/RN-AffinityAPI/

Mac OS X tidak mengekspor antarmuka yang mengidentifikasi prosesor atau mengontrol penempatan utas — utas eksplisit ke pengikatan prosesor tidak didukung . Sebagai gantinya, kernel mengelola semua penempatan thread. Aplikasi berharap bahwa penjadwal akan, dalam sebagian besar keadaan, menjalankan utasnya menggunakan penempatan prosesor yang baik sehubungan dengan afinitas cache.

ta.speot.is
sumber
2
OS X telah mendukung API afinitas utas sejak versi 10.5. Lihat jawaban saya untuk detailnya.
void-pointer
4

Hingga saat ini, penjadwal XNU (1504.3.12) tidak menerapkan afinitas prosesor untuk proses atau utas.

Jadi MacOSX tidak menyediakan sarana untuk melakukan itu.

jweyrich
sumber
2

Dari http://images.apple.com/macosx/docs/OSX_for_UNIX_Users_TB_July2011.pdf

• Utas kernel yang efisien. Setiap thread POSIX di-antri ke CPU tertentu, meningkatkan afinitas dan skalabilitas prosesor sekaligus mengurangi pertikaian kunci. Utas sesuai dengan POSIX (1c), termasuk dukungan untuk pembatalan dan mutex bersama.

Tampaknya seperti iklan bagi saya, iMac saya yang menjalankan Lion terlihat sangat menghormati sebagian besar waktu, tetapi tidak melakukan proses pin to a core.

Saya tidak dapat menemukan API untuk mengontrol afinitas proses untuk darwin.

Alan Baldo
sumber