Anda melihat frasa ini atau sejenisnya berputar-putar dari waktu ke waktu, umumnya merujuk pada sebuah program yang mengklaim mereka tidak dirancang untuk mengambil keuntungan penuh dari prosesor multi-core. Ini umum terutama dengan pemrograman video game. (tentu saja banyak program tidak memiliki konkurensi dan tidak memerlukannya, seperti skrip dasar, dll).
Bagaimana ini bisa terjadi? Banyak program (terutama game) yang secara inheren menggunakan konkurensi, dan karena OS bertanggung jawab atas penjadwalan tugas pada CPU, maka apakah program-program ini secara inheren tidak mengambil keuntungan dari beberapa core yang tersedia? Apa artinya dalam konteks ini untuk "mengambil keuntungan dari banyak core"? Apakah pengembang ini sebenarnya melarang penjadwalan tugas OS dan memaksa afinitas atau penjadwalan mereka sendiri? (Kedengarannya seperti masalah stabilitas utama).
Saya seorang programmer Java, jadi mungkin saya tidak harus berurusan dengan ini karena abstraksi atau yang lainnya.
sumber
Jawaban:
Konkurensi yang baik membutuhkan lebih dari sekadar melemparkan beberapa utas dalam suatu aplikasi dan berharap yang terbaik. Ada rentang bagaimana program bersamaan dapat berjalan dari paralel memalukan ke berurutan murni. Setiap program yang diberikan dapat menggunakan hukum Amdahl untuk mengungkapkan seberapa scalable suatu masalah atau algoritma. Beberapa kualifikasi untuk aplikasi paralel yang memalukan adalah:
Ada kualifikasi lain, tetapi hanya dengan dua ini kita dapat memahami mengapa gim tertentu tidak semudah yang Anda bayangkan untuk memanfaatkan banyak inti. Untuk satu, model dunia yang akan dirender harus dibagikan sebagai fungsi yang berbeda menghitung fisika, gerakan, menerapkan kecerdasan buatan dll. Kedua, setiap bingkai model permainan ini harus ditampilkan di layar dengan kartu grafis.
Agar adil, banyak pembuat game menggunakan mesin game yang diproduksi oleh pihak ketiga. Butuh beberapa saat, tetapi mesin-mesin permainan pihak ketiga ini sekarang jauh lebih sejajar dari sebelumnya.
Ada tantangan arsitektur yang lebih besar dalam berurusan dengan konkurensi efektif
Concurrency dapat mengambil banyak bentuk, dari menjalankan tugas di latar belakang hingga dukungan arsitektur penuh untuk concurrency. Beberapa bahasa memberi Anda fitur konkurensi yang sangat kuat seperti ERLANG , tetapi mengharuskan Anda untuk berpikir sangat berbeda tentang bagaimana Anda membangun aplikasi Anda.
Tidak setiap program benar-benar membutuhkan kompleksitas dukungan multicore penuh. Salah satu contohnya adalah perangkat lunak pajak, atau aplikasi yang didorong oleh formulir. Ketika sebagian besar waktu Anda dihabiskan menunggu pengguna untuk melakukan sesuatu, kompleksitas aplikasi multithreaded tidak begitu berguna.
Beberapa aplikasi memberikan solusi paralel yang lebih memalukan, seperti aplikasi web. Dalam hal ini, platform dimulai paralel memalukan dan terserah Anda tidak harus memaksakan pertengkaran thread.
Garis bawah:
Tidak semua aplikasi benar-benar terluka karena tidak memanfaatkan banyak utas (dan karenanya, inti). Untuk orang-orang yang terluka oleh itu, kadang-kadang perhitungan tidak ramah dengan pemrosesan paralel atau overhead untuk mengoordinasikannya akan membuat aplikasi lebih rapuh. Sayangnya, pemrosesan paralel masih tidak semudah yang seharusnya dilakukan dengan baik.
sumber
Tidak, sebenarnya sebaliknya. Sebagian besar aplikasi ditulis dalam satu pola pikir utas, dan pengembang tidak pernah membuat perubahan yang diperlukan untuk mendukung konkurensi.
Di C, C ++, dan C # Anda harus memberi tahu aplikasi secara eksplisit untuk memulai utas dan / atau proses baru.
Saya pikir Anda terlalu fokus pada penjadwalan utas dan tidak cukup pada penanganan data dalam utas potensial. Berbagi data di utas dan / atau proses memerlukan beberapa bentuk sinkronisasi. Jika Anda mengubah aplikasi untuk menggunakan banyak utas tetapi gagal untuk menyinkronkannya maka Anda mungkin akan melihat banyak kesulitan untuk melacak bug dalam kode.
Untuk aplikasi multi-utas yang telah saya kerjakan, saya umumnya tidak pernah khawatir tentang pengiriman dan hanya tentang sinkronisasi data. Satu-satunya waktu saya harus khawatir tentang pengiriman adalah ketika saya mengejar kondisi balapan karena sinkronisasi data yang salah.
Secara umum, ketika suatu aplikasi mengatakan itu tidak dapat menggunakan beberapa core maka itu berarti mereka tidak memiliki sinkronisasi untuk melindungi manipulasi data.
sumber
Ini bukan tentang banyak inti tetapi tentang banyak utas. OS dapat menjadwalkan utas untuk dijalankan pada inti apa pun yang disukainya, dan penjadwalan ini transparan untuk program yang dijadwalkan. Namun, banyak program tidak ditulis menggunakan banyak utas, sehingga hanya bisa berjalan pada satu inti sekaligus.
Mengapa saya menulis program single-threaded? Mereka lebih mudah untuk ditulis dan lebih mudah untuk di-debug: satu hal terjadi secara berurutan (alih-alih banyak hal terjadi sekaligus dan mungkin saling bertentangan). Atau program Anda mungkin tidak menargetkan mesin multi-core (seperti halnya game-game lama). Dalam beberapa kasus, program multi-ulir bahkan dapat berjalan lebih lambat daripada versi satu-ulir jika overhead dari konteks-switch dan komunikasi antara thread melebihi kecepatan yang diperoleh dengan eksekusi paralel (beberapa bagian dari program mungkin tidak dapat diparalelkan).
sumber
Ini bukan jawaban lengkap. Ini adalah kisah peringatan.
Suatu hari saya pikir saya akan menunjukkan kepada siswa dalam kursus pemrograman bersamaan saya quicksort paralel. Quicksort harus sejajar dengan baik, pikir saya. Saya menggunakan dua utas. Jalankan di komputer single core saya. Hasilnya adalah:
Ini tentang apa yang saya harapkan.
Lalu saya mencobanya pada mesin dual-core yang lebih baru.
Kedua utas berbagi antrian tugas yang tersisa. Tampaknya bidang objek antrian sedang bolak-balik antara cache satu inti dan yang lain.
sumber