Bagaimana memprogram alokasi utas pada prosesor multicore?

13

Saya ingin bereksperimen dengan utas pada prosesor multi-inti, misalnya untuk membuat program yang menggunakan dua utas berbeda yang dijalankan oleh dua inti prosesor yang berbeda.

Namun, tidak jelas bagi saya di tingkat mana benang dialokasikan ke inti yang berbeda. Saya bisa membayangkan skenario berikut (tergantung pada sistem operasi dan implementasi bahasa pemrograman):

  1. Alokasi utas dikelola oleh sistem operasi. Utas dibuat menggunakan panggilan sistem OS dan, jika proses tersebut berjalan pada prosesor multi-inti, OS secara otomatis mencoba mengalokasikan / menjadwalkan utas yang berbeda pada inti yang berbeda.
  2. Alokasi utas dikelola oleh implementasi bahasa pemrograman. Mengalokasikan utas ke inti yang berbeda membutuhkan pemanggilan sistem khusus, tetapi pustaka utas standar bahasa pemrograman secara otomatis menangani ini ketika saya menggunakan implementasi utas standar untuk bahasa itu.
  3. Alokasi utas harus diprogram secara eksplisit. Dalam program saya, saya harus menulis kode eksplisit untuk mendeteksi berapa banyak core yang tersedia dan untuk mengalokasikan utas yang berbeda untuk inti yang berbeda menggunakan, misalnya, fungsi perpustakaan.

Untuk membuat pertanyaan lebih spesifik, bayangkan saya telah menulis aplikasi multi-threaded saya di Java atau C ++ di Windows atau Linux. Apakah aplikasi saya secara ajaib melihat dan menggunakan banyak core ketika dijalankan pada prosesor multi-core (karena semuanya dikelola baik oleh sistem operasi atau oleh pustaka thread standar), atau apakah saya harus memodifikasi kode saya untuk mengetahui beberapa core ?

Giorgio
sumber

Jawaban:

11

Apakah aplikasi saya secara ajaib melihat dan menggunakan banyak core ketika dijalankan pada prosesor multi-core (karena semuanya dikelola baik oleh sistem operasi atau oleh pustaka thread standar), atau apakah saya harus memodifikasi kode saya untuk mengetahui beberapa core ?

Jawaban sederhana: Ya, biasanya akan dikelola oleh sistem operasi atau pustaka threading.

Subsistem threading dalam sistem operasi akan menetapkan utas ke prosesor berdasarkan prioritas (opsi Anda 1). Dengan kata lain, ketika utas telah selesai mengeksekusi untuk alokasi waktu atau bloknya, penjadwal mencari utas prioritas tertinggi berikutnya dan menetapkannya ke CPU. Rinciannya bervariasi dari sistem operasi ke sistem operasi.

Yang mengatakan, opsi 2 (dikelola oleh bahasa pemrograman) dan 3 (secara eksplisit) ada. Misalnya, perpustakaan Tugas dan async / menunggu dalam versi terbaru dari .Net memberi pengembang cara yang jauh lebih mudah untuk menulis kode yang dapat diparalelkan (yaitu yang dapat berjalan secara bersamaan dengan dirinya sendiri). Bahasa pemrograman fungsional secara bawaan dapat diparalelkan dan beberapa runtime akan menjalankan berbagai bagian program secara paralel jika memungkinkan.

Adapun opsi 3 (secara eksplisit), Windows memungkinkan Anda untuk mengatur afinitas utas (menentukan prosesor mana yang dapat dijalankan oleh sebuah utas). Namun, ini biasanya tidak perlu di semua kecuali sistem kritis, waktu respons tercepat. Thread yang efektif untuk alokasi prosesor sangat tergantung pada perangkat keras dan sangat sensitif terhadap aplikasi lain yang berjalan secara bersamaan.

Jika Anda ingin bereksperimen, buat tugas yang berjalan lama dan intensif CPU seperti membuat daftar bilangan prima atau membuat set Mandelbrot. Sekarang buat dua utas di perpustakaan favorit Anda dan jalankan kedua utas pada mesin multi-prosesor (dengan kata lain, apa saja yang dirilis dalam beberapa tahun terakhir). Kedua tugas harus diselesaikan dalam waktu yang hampir bersamaan karena dijalankan secara paralel.

akton
sumber
Terima kasih atas penjelasannya (+1). Program pengujian saya adalah implementasi semacam penggabungan. Pada fase split, saya ingin membuat utas yang berbeda selama ada inti yang tersedia. Misal, dengan dua core, setiap setengah dari array akan diurutkan berdasarkan thread / core yang berbeda. Selama penggabungan, thread yang tidak berguna kemudian akan bergabung / diakhiri.
Giorgio
Penyortiran sulit untuk diparalelkan dengan cara ini jika data didistribusikan secara acak. Ya, Anda dapat memecahnya lalu mengurutkan masing-masing bagian di utas yang berbeda tetapi akhirnya Anda harus menggabungkan semua bagian bersama-sama. Jika utas berbagi struktur data, Anda mungkin juga mendapatkan pertikaian atau masalah penguncian. Saya tidak mengatakan penyortiran tidak bisa mendapatkan manfaat dari threading tetapi tidak akan menjadi peningkatan kinerja linier.
akton
Dua bagian array dapat diurutkan secara independen karena tidak ada data yang dibagikan. Hanya pemisahan pertama dan gabungan terakhir yang harus dilakukan oleh satu utas yang memanipulasi seluruh array atau daftar yang berisi data. Ini berarti bahwa satu pemindaian lengkap data tidak dapat dieksekusi secara paralel; semua pemindaian yang tersisa bisa.
Giorgio
Tentu saja, saya juga menganggap contoh Anda sebagai kandidat yang baik. Saya hanya lebih akrab dengan semacam penggabungan saat ini (dan saya telah mengimplementasikan versi non-paralelnya), yang (mungkin) akan membuat semacam gabungan lebih cocok untuk saya sebagai upaya pertama.
Giorgio
2
Saya akan menambahkan jawaban ini bahwa sistem operasi yang baik cukup pintar untuk menyeimbangkan biaya memberikan tugas waktu pada CPU atau inti yang berbeda dengan kelaparan jangka pendek. Pada arsitektur yang penting, hasilnya cenderung menyerupai afinitas automagic. OS telah dibangun untuk menjalankan semua pekerjaan secepat mungkin, dan Anda mungkin menembak diri sendiri dengan mengikat tali ke inti dan melumpuhkan kemampuannya untuk membuat keputusan tersebut.
Blrfl
-1

Saya pernah memiliki lingkungan IRIX SGI yang besar. Hanya untuk itu, saya menulis sebuah program java multi-threaded kecil (yang hanya melakukan siklus CPU) dan membuat 12 thread di dalamnya. Pekerjaan membentang di 12 CPU dalam arsitektur NUMA. Mungkin saya akan mencari program dan menjalankannya pada Dell R910s dan periksa ..

P. Prabhakar
sumber
3
Jawaban ini benar-benar tidak menambah banyak jawaban yang ada. Mungkin jika Anda menjelaskan mengapa JVM pada sistem SGI mengalokasikan utas ke inti ...
Jay Elston