Apakah ada praktik usang untuk pemrograman multithread dan multiprosesor yang seharusnya tidak saya gunakan lagi?

36

Pada awal FORTRAN dan BASIC, pada dasarnya semua program ditulis dengan pernyataan GOTO. Hasilnya adalah kode spaghetti dan solusinya adalah pemrograman terstruktur.

Demikian pula, pointer dapat memiliki kesulitan untuk mengontrol karakteristik dalam program kami. C ++ dimulai dengan banyak petunjuk, tetapi disarankan menggunakan referensi. Perpustakaan seperti STL dapat mengurangi ketergantungan kami. Ada juga idiom untuk membuat pointer pintar yang memiliki karakteristik lebih baik, dan beberapa versi C ++ mengizinkan referensi dan kode terkelola.

Praktek pemrograman seperti pewarisan dan polimorfisme menggunakan banyak petunjuk di belakang layar (seperti halnya, sementara, pemrograman terstruktur menghasilkan kode yang diisi dengan instruksi cabang). Bahasa seperti Java menghilangkan pointer dan menggunakan pengumpulan sampah untuk mengelola data yang dialokasikan secara dinamis alih-alih bergantung pada programmer untuk mencocokkan semua pernyataan baru dan yang dihapus mereka.

Dalam bacaan saya, saya telah melihat contoh pemrograman multi-proses dan multi-thread yang tampaknya tidak menggunakan semaphores. Apakah mereka menggunakan hal yang sama dengan nama yang berbeda atau apakah mereka memiliki cara baru untuk menyusun perlindungan sumber daya dari penggunaan bersamaan?

Sebagai contoh, contoh spesifik dari sistem untuk pemrograman multithread dengan prosesor multicore adalah OpenMP. Ini mewakili wilayah kritis sebagai berikut, tanpa menggunakan semaphores, yang tampaknya tidak dimasukkan dalam lingkungan.

th_id = omp_get_thread_num();
#pragma omp critical
{
  cout << "Hello World from thread " << th_id << '\n';
}

Contoh ini adalah kutipan dari: http://en.wikipedia.org/wiki/OpenMP

Atau, perlindungan yang serupa dari satu sama lain menggunakan semafor dengan fungsi wait () dan signal () mungkin terlihat seperti ini:

wait(sem);
th_id = get_thread_num();
cout << "Hello World from thread " << th_id << '\n';
signal(sem);

Dalam contoh ini, segalanya cukup sederhana, dan hanya ulasan sederhana sudah cukup untuk menunjukkan panggilan wait () dan signal () cocok dan bahkan dengan banyak konkurensi, keamanan utas disediakan. Tetapi algoritma lain lebih rumit dan menggunakan beberapa semaphores (baik biner dan berhitung) tersebar di beberapa fungsi dengan kondisi kompleks yang dapat dipanggil oleh banyak utas. Konsekuensi dari menciptakan kebuntuan atau gagal membuat hal-hal yang aman bisa sulit untuk dikelola.

Apakah sistem ini seperti OpenMP menghilangkan masalah dengan semaphores?
Apakah mereka memindahkan masalah ke tempat lain?
Bagaimana cara mengubah semaphore favorit saya menggunakan algoritma untuk tidak menggunakan semaphore lagi?

Pengembang Don
sumber
Apa yang sebenarnya kamu bicarakan? Apa yang Anda lihat?
svick
4
Tidak bermaksud kasar, tetapi Anda bisa menghilangkan tiga paragraf pertama. Mereka tidak benar-benar mendukung pertanyaan Anda, dan mereka terlalu banyak mengambil kesimpulan dan hanya akan menghasilkan banyak argumen.
dbracey
1
Wah, edit besar. Saya telah menusuk jawaban. Pertanyaannya masih seperti mengembara melalui GOTO, pointer, warisan, dan polimorfisme, tetapi dalam jawaban saya, saya telah mengesampingkan masalah ini dan berfokus pada pertanyaan "praktik yang sudah usang".
Stuart Marks

Jawaban:

15

Adakah teknik dan praktik pemrograman bersamaan yang tidak boleh digunakan lagi? Saya akan mengatakan ya .

Salah satu teknik pemrograman konkurensi awal yang tampaknya langka saat ini adalah pemrograman interrupt-driven . Beginilah cara kerja UNIX di tahun 1970-an. Lihat Lions Commentary tentang UNIX atau Desain Bach dari Sistem Operasi UNIX . Secara singkat, tekniknya adalah untuk menangguhkan interupsi sementara saat memanipulasi struktur data, dan kemudian mengembalikan interupsi sesudahnya. The BSD spl (9) halaman manualmemiliki contoh gaya pengkodean ini. Perhatikan bahwa interupsi berorientasi pada perangkat keras, dan kode mewujudkan hubungan implisit antara jenis interupsi perangkat keras dan struktur data yang terkait dengan perangkat keras itu. Misalnya, kode yang memanipulasi buffer I / O disk perlu menangguhkan interupsi dari perangkat keras pengontrol disk saat bekerja dengan buffer tersebut.

Gaya pemrograman ini digunakan oleh sistem operasi pada perangkat keras uniprocessor. Itu jauh lebih jarang untuk aplikasi untuk berurusan dengan interupsi. Beberapa OS mengalami gangguan perangkat lunak, dan saya pikir orang-orang mencoba membangun sistem threading atau coroutine di atasnya, tetapi ini tidak terlalu luas. (Tentu saja tidak di dunia UNIX.) Saya menduga bahwa pemrograman gaya interupsi terbatas hari ini untuk sistem tertanam kecil atau sistem waktu nyata.

Semafor adalah kemajuan dari interupsi karena mereka adalah konstruksi perangkat lunak (tidak terkait dengan perangkat keras), mereka memberikan abstraksi atas fasilitas perangkat keras, dan mereka memungkinkan multithreading dan multiprocessing. Masalah utama adalah bahwa mereka tidak terstruktur. Programmer bertanggung jawab untuk menjaga hubungan antara setiap semafor dan struktur data yang dilindunginya, secara global di seluruh program. Untuk alasan ini saya pikir semaphore telanjang jarang digunakan hari ini.

Langkah kecil ke depan lainnya adalah monitor , yang merangkum mekanisme kontrol konkurensi (kunci dan kondisi) dengan data yang dilindungi. Ini dibawa ke sistem Mesa (tautan alternatif) dan dari sana ke Jawa. (Jika Anda membaca makalah Mesa ini, Anda dapat melihat bahwa kunci dan kondisi monitor Jawa disalin hampir secara verbatim dari Mesa.) Monitor sangat membantu dalam hal programmer yang cukup teliti dan rajin dapat menulis program bersamaan dengan aman menggunakan hanya alasan lokal tentang kode dan data di dalam monitor.

Ada konstruksi perpustakaan tambahan, seperti yang ada di java.util.concurrentpaket Java , yang mencakup berbagai struktur data yang sangat bersamaan dan konstruksi kumpulan benang. Ini dapat dikombinasikan dengan teknik tambahan seperti kurungan benang dan kekekalan efektif. Lihat Java Concurrency In Practice oleh Goetz et. Al. untuk diskusi lebih lanjut. Sayangnya, banyak programmer masih menggulirkan struktur data mereka sendiri dengan kunci dan kondisi, ketika mereka benar-benar harus menggunakan sesuatu seperti ConcurrentHashMap mana pengangkatan berat telah dilakukan oleh penulis perpustakaan.

Segala sesuatu di atas memiliki beberapa karakteristik penting: mereka memiliki banyak untaian kontrol yang berinteraksi secara global, keadaan yang bisa berubah . Masalahnya adalah pemrograman dengan gaya ini masih sangat rawan kesalahan. Sangat mudah untuk kesalahan kecil tanpa disadari, mengakibatkan perilaku buruk yang sulit untuk direproduksi dan didiagnosis. Mungkin tidak ada programmer yang "cukup hati-hati dan rajin" untuk mengembangkan sistem besar dengan cara ini. Setidaknya, sangat sedikit. Jadi, saya akan mengatakan bahwa pemrograman multi-threaded dengan berbagi, keadaan bisa berubah harus dihindari jika keadaan memungkinkan.

Sayangnya tidak sepenuhnya jelas apakah itu dapat dihindari dalam semua kasus. Banyak pemrograman masih dilakukan dengan cara ini. Akan menyenangkan melihat ini digantikan oleh sesuatu yang lain. Jawaban dari Jarrod Roberson dan davidk01 menunjukkan teknik-teknik seperti data yang tidak dapat diubah, pemrograman fungsional, STM, dan penyampaian pesan. Ada banyak yang direkomendasikan, dan semuanya sedang dikembangkan secara aktif. Tapi saya tidak berpikir mereka telah sepenuhnya menggantikan keadaan yang bisa berubah yang dibagikan yang kuno dengan baik.

EDIT: inilah tanggapan saya terhadap pertanyaan spesifik di bagian akhir.

Saya tidak tahu banyak tentang OpenMP. Kesan saya adalah ini bisa sangat efektif untuk masalah yang sangat paralel seperti simulasi numerik. Tapi sepertinya itu bukan tujuan umum. Konstruksi semaphore tampaknya cukup rendah dan mengharuskan programmer untuk menjaga hubungan antara semaphore dan struktur data bersama, dengan semua masalah yang saya jelaskan di atas.

Jika Anda memiliki algoritma paralel yang menggunakan semaphores, saya tidak tahu ada teknik umum untuk mengubahnya. Anda mungkin dapat mengubahnya menjadi objek dan kemudian membangun beberapa abstraksi di sekitarnya. Tetapi jika Anda ingin menggunakan sesuatu seperti pesan-lewat, saya pikir Anda benar-benar perlu merekonseptualisasikan seluruh masalah.

Stuart Marks
sumber
Terima kasih, ini informasi yang bagus. Saya akan melihat referensi dan menyelam lebih dalam pada konsep yang Anda sebutkan yang baru bagi saya.
PengembangDon
+1 untuk java.util.concurrent dan menyetujui komentar - sudah ada di JDK sejak 1.5 dan saya jarang jika pernah melihatnya digunakan.
MebAlone
1
Saya harap Anda menyoroti betapa pentingnya untuk tidak menggulung struktur Anda sendiri ketika yang sudah ada. Begitu banyak, sangat banyak bug ...
corsiKa
Saya tidak berpikir itu akurat untuk mengatakan, "Semaphores adalah kemajuan dari interupsi karena mereka adalah konstruksi perangkat lunak (tidak terkait dengan perangkat keras) ". Semaphores bergantung pada CPU untuk mengimplementasikan instruksi Compare-and-Swap , atau varian multi-core .
Josh Pearce
@JoshPearce Tentu saja semaphore diimplementasikan menggunakan konstruksi perangkat keras, tetapi mereka adalah abstraksi yang tidak tergantung pada konstruksi perangkat keras tertentu, seperti CAS, test-and-set, cmpxchng, dll.
Stuart Marks
28

Jawab pertanyaan

Konsensus umum adalah negara yang dapat diubah adalah Bad ™, dan keadaan tidak berubah adalah Good ™, yang terbukti akurat dan benar berulang kali oleh bahasa fungsional dan bahasa imperatif juga.

Masalahnya adalah bahasa imperatif arus utama tidak dirancang untuk menangani cara kerja ini, hal-hal tidak akan berubah untuk bahasa-bahasa tersebut pada malam hari. Di sinilah perbandingan untuk GOTOcacat. Keadaan yang tidak dapat berubah dan pesan yang lewat adalah solusi yang bagus tetapi juga bukan obat mujarab.

Premis yang cacat

Pertanyaan ini didasarkan pada perbandingan dengan premis yang cacat; itu GOTOadalah masalah aktual dan secara universal tidak digunakan lagi oleh Dewan Desainer Bahasa Intergalatic Universal dan Serikat Rekayasa Perangkat Lunak ©! Tanpa GOTOmekanisme ASM tidak akan berfungsi sama sekali. Sama dengan premis bahwa pointer mentah adalah masalah dengan C atau C ++ dan bagaimana pointer cerdas adalah obat mujarab, mereka tidak.

GOTObukan masalahnya, programmer adalah masalahnya. Hal yang sama berlaku untuk status yang dapat diubah bersama . Ini dengan sendirinya bukan masalah , itu adalah programer yang menggunakannya masalahnya. Jika ada cara untuk menghasilkan kode yang menggunakan status dapat dibagikan bersama dengan cara yang tidak pernah memiliki kondisi ras atau bug, maka itu tidak akan menjadi masalah. Sama seperti jika Anda tidak pernah menulis kode spaghetti dengan GOTOatau konstruksi yang tidak pasti, itu juga bukan masalah.

Pendidikan adalah Panacea

Pemrogram idiot adalah apa yang ada deprecated, setiap bahasa populer masih memiliki GOTOkonstruk baik secara langsung maupun tidak langsung dan itu adalah best practiceketika benar digunakan dalam setiap bahasa yang memiliki jenis konstruksi ini.

CONTOH: Java memiliki label dan try/catch/finallykeduanya langsung berfungsi sebagai GOTOpernyataan.

Kebanyakan programmer Java yang saya ajak bicara bahkan tidak tahu apa immutableartinya sebenarnya di luar mereka mengulangi the String class is immutabledengan zombie seperti pandangan di mata mereka. Mereka pasti tidak tahu cara menggunakan finalkata kunci dengan benar untuk membuat immutablekelas. Jadi saya cukup yakin mereka tidak tahu mengapa pengiriman pesan menggunakan pesan yang tidak dapat diubah begitu hebat dan mengapa keadaan yang dapat dibagikan yang dibagi sangat tidak bagus.

Komunitas
sumber
3
+1 Jawaban yang bagus, ditulis dengan jelas dan menunjukkan pola yang mendasari keadaan yang bisa berubah. IUBLDSEU harus menjadi meme :)
Dibbeke
2
GOTO adalah kata sandi untuk 'tolong, tidak benar-benar tolong memulai perang api di sini, saya gandakan anjing berani kamu'. Pertanyaan ini memadamkan api tetapi tidak benar-benar memberikan jawaban yang baik. Sebutan yang terhormat tentang pemrograman fungsional dan imutabilitas sangat bagus tetapi tidak ada daging untuk pernyataan itu.
Evan Plaice
1
Ini sepertinya jawaban yang kontradiktif. Pertama, Anda mengatakan "A is Bad, B is Good", lalu Anda mengatakan "Idiots sudah usang". Bukankah hal yang sama berlaku untuk paragraf pertama? Tidak bisakah saya mengambil bagian terakhir dari jawaban Anda dan mengatakan "Keadaan yang dapat dibagikan bersama adalah praktik terbaik bila digunakan dengan benar dalam setiap bahasa". Juga, "bukti" adalah kata yang sangat kuat. Anda tidak boleh menggunakannya kecuali Anda memiliki bukti yang sangat kuat.
luiscubal
2
Bukan niat saya untuk memulai perang api. Sampai Jarrod bereaksi terhadap komentar saya, berpikir bahwa GOTO tidak kontroversial dan akan bekerja dengan baik dalam analogi. Ketika saya menulis pertanyaan, itu tidak terpikir oleh saya, tetapi Dijkstra berada di titik nol pada GOTO dan semafor. Edsger Dijkstra bagaikan raksasa bagi saya, dan dikreditkan dengan penemuan semaphores (1965) dan awal (1968) karya ilmiah tentang GOTO. Metode advokasi Dijkstra seringkali keras dan konfrontatif. Kontroversi / konfrontasi berhasil untuknya, tetapi saya hanya ingin ide tentang alternatif yang mungkin untuk semafor.
PengembangDon
1
Banyak program seharusnya memodelkan hal-hal yang, di dunia nyata, bisa berubah. Jika pada pukul 5:37 pagi, objek # 451 memegang keadaan sesuatu di dunia nyata pada saat itu (5:37 pagi), dan keadaan benda dunia nyata kemudian berubah, itu mungkin untuk identitas objek yang mewakili keadaan dunia nyata menjadi tidak berubah (yaitu benda akan selalu diwakili oleh objek # 451), atau untuk objek # 451 menjadi abadi, tetapi tidak keduanya. Dalam banyak kasus, memiliki identitas tidak dapat diubah akan lebih bermanfaat daripada memiliki objek # 451 tidak dapat diubah.
supercat
27

Kemarahan terbaru di kalangan akademis tampaknya adalah Software Transactional Memory (STM) dan berjanji untuk mengambil semua detail berbulu pemrograman multi-threaded dari tangan para programmer dengan menggunakan teknologi kompiler yang cukup pintar. Di balik layar itu masih terkunci dan semafor tetapi Anda sebagai programmer tidak perlu khawatir tentang hal itu. Manfaat dari pendekatan itu masih belum jelas dan tidak ada pesaing yang jelas.

Erlang menggunakan passing pesan dan agen untuk konkurensi dan itu adalah model yang lebih sederhana untuk digunakan dibandingkan STM. Dengan pesan yang lewat, Anda sama sekali tidak perlu khawatir tentang kunci dan semafor karena setiap agen beroperasi di mini universe sendiri sehingga tidak ada kondisi ras terkait data. Anda masih memiliki beberapa kasus tepi yang aneh, tetapi tidak terlalu rumit seperti livelocks dan deadlock. Bahasa JVM dapat menggunakan Akka dan mendapatkan semua manfaat dari penyampaian pesan dan aktor, tetapi tidak seperti Erlang, JVM tidak memiliki dukungan bawaan untuk aktor sehingga pada akhirnya Akka masih menggunakan utas dan kunci tetapi Anda sebagai programmer tidak perlu khawatir.

Model lain yang saya tahu yang tidak menggunakan kunci dan utas adalah dengan menggunakan futures yang sebenarnya hanyalah bentuk lain dari pemrograman async.

Saya tidak yakin berapa banyak teknologi ini tersedia dalam C ++ tetapi kemungkinannya adalah jika Anda melihat sesuatu yang tidak secara eksplisit menggunakan utas dan kunci maka itu akan menjadi salah satu teknik di atas untuk mengelola konkurensi.

davidk01
sumber
+1 untuk istilah "detail berbulu" baru. LOL sobat. Aku hanya tidak bisa berhenti menertawakan istilah baru ini. Saya kira saya akan menggunakan "kode berbulu" mulai sekarang.
Saeed Neamati
1
@Seed: Saya pernah mendengar ungkapan itu sebelumnya, ini tidak biasa. Saya setuju itu lucu :-)
Cameron
1
Jawaban yang bagus. CLI .NET seharusnya juga memiliki dukungan untuk pensinyalan (bukan penguncian), tetapi saya belum menemukan contoh di mana ia sepenuhnya menggantikan penguncian. Saya tidak yakin apakah async masuk hitungan. Jika Anda berbicara tentang platform seperti Javascript / NodeJs, mereka sebenarnya single-threaded dan hanya lebih baik pada beban IO tinggi karena mereka jauh lebih rentan terhadap batas sumber daya maxing (yaitu pada satu ton konteks dibuang). Pada beban intensif CPU, ada sedikit / tidak ada manfaat untuk menggunakan pemrograman async.
Evan Plaice
1
Jawaban yang menarik, saya belum pernah menemukan masa depan sebelumnya. Perhatikan juga bahwa Anda masih dapat menemui jalan buntu dan livelock dalam sistem pengiriman pesan seperti Erlang . CSP memungkinkan Anda untuk alasan formal tentang kebuntuan dan livelock tetapi tidak mencegahnya dengan sendirinya.
Mark Booth
1
Saya akan menambahkan Kunci gratis dan menunggu struktur data gratis ke daftar itu.
stonemetal
3

Saya pikir ini sebagian besar tentang tingkat abstraksi. Cukup sering dalam pemrograman, berguna untuk mengabstraksi beberapa detail dengan cara yang lebih aman atau lebih mudah dibaca atau sesuatu seperti itu.

Ini berlaku untuk struktur kontrol: ifs, fors dan bahkan try- catchblok hanyalah abstraksi atas gotos. Abstraksi ini hampir selalu berguna, karena mereka membuat kode Anda lebih mudah dibaca. Tetapi ada beberapa kasus ketika Anda masih perlu menggunakan goto(misalnya jika Anda menulis perakitan dengan tangan).

Ini juga berlaku untuk manajemen memori: C ++ smart pointer dan GC adalah abstraksi atas raw pointer dan alokasi memori manual. Dan kadang-kadang, abstraksi ini tidak sesuai, misalnya ketika Anda benar-benar membutuhkan kinerja maksimal.

Dan hal yang sama berlaku untuk multi-threading: hal-hal seperti futures dan aktor hanyalah abstraksi atas utas, semafor, mutex, dan instruksi CAS. Abstraksi semacam itu dapat membantu Anda membuat kode Anda lebih mudah dibaca dan mereka juga membantu Anda menghindari kesalahan. Tetapi kadang-kadang, mereka tidak tepat.

Anda harus tahu alat apa yang Anda miliki dan apa kelebihan dan kekurangannya. Kemudian Anda dapat memilih abstraksi yang benar untuk tugas Anda (jika ada). Level abstraksi yang lebih tinggi tidak mengurangi level yang lebih rendah, akan selalu ada beberapa kasus di mana abstraksi tidak sesuai dan pilihan terbaik adalah menggunakan "cara lama".

svick
sumber
Terima kasih, Anda menangkap analogi, dan saya tidak punya ide yang sudah terbentuk sebelumnya atau bahkan kapak untuk menggiling, apakah jawaban WRT semaphore adalah bahwa mereka adalah atau tidak usang. Pertanyaan yang lebih besar bagi saya adalah apakah ada cara yang lebih baik dan dalam sistem yang tampaknya tidak memiliki semaphores kehilangan sesuatu yang penting dan apakah mereka tidak dapat melakukan berbagai algoritma multithread.
PengembangDon
2

Ya, tetapi Anda tidak akan bertemu dengan beberapa di antaranya.

Di masa lalu, sudah biasa menggunakan metode pemblokiran (penghalang sinkronisasi) karena menulis mutex yang baik sulit dilakukan dengan benar. Anda masih dapat melihat jejak-jejak ini dalam hal-hal seperti Menggunakan perpustakaan konkurensi modern baru-baru ini memberi Anda seperangkat alat yang lebih kaya, dan teruji secara menyeluruh untuk paralelisasi dan koordinasi antar-proses.

Demikian juga, praktik yang lebih lama adalah menulis kode yang menyiksa sehingga Anda bisa mengetahui cara memparalelkannya secara manual. Bentuk pengoptimalan (berpotensi berbahaya, jika Anda salah) juga sebagian besar telah keluar jendela dengan munculnya kompiler yang melakukan ini untuk Anda, melepaskan loop jika perlu, memprediksi cabang berikut, dll. Ini bukan teknologi baru, namun , Paling tidak 15 tahun di pasar. Mengambil keuntungan dari hal-hal seperti kolam utas juga menghindari beberapa kode yang benar-benar rumit tadi.

Jadi mungkin praktik yang sudah usang adalah menulis kode konkurensi sendiri, alih-alih menggunakan perpustakaan modern yang telah teruji dengan baik.

Alex Feinman
sumber
Terima kasih. Sepertinya ada potensi besar untuk menggunakan pemrograman bersamaan, tetapi bisa menjadi kotak Pandora jika tidak digunakan secara disiplin.
DeveloperDon
2

Grand Central Dispatch Apple adalah abstraksi elegan yang mengubah pemikiran saya tentang konkurensi. Fokusnya pada antrian membuat penerapan logika asinkron menjadi lebih mudah, dalam pengalaman saya yang sederhana.

Ketika saya memprogram di lingkungan di mana tersedia, itu telah menggantikan sebagian besar penggunaan saya utas, kunci, dan komunikasi antar-utas.

orip
sumber
1

Salah satu perubahan utama pada pemrograman paralel adalah bahwa CPU jauh lebih cepat dari sebelumnya, tetapi untuk mencapai kinerja itu, memerlukan cache yang diisi dengan baik. Jika Anda mencoba menjalankan beberapa utas sekaligus bertukar di antaranya, Anda hampir selalu akan membuat cache tidak valid untuk setiap utas (yaitu, masing-masing utas membutuhkan data yang berbeda untuk beroperasi) dan Anda akhirnya mematikan kinerja lebih banyak daripada Anda terbiasa dengan CPU yang lebih lambat.

Ini adalah salah satu alasan mengapa kerangka kerja async atau berbasis tugas (misalnya Grand Central Dispatch, atau TBB Intel) lebih populer, mereka menjalankan tugas kode 1 pada suatu waktu, menyelesaikannya sebelum pindah ke yang berikutnya - namun, Anda harus mengkodekan masing-masing setiap tugas hanya membutuhkan sedikit waktu kecuali Anda ingin mengacaukan desain (mis. tugas paralel Anda benar-benar antri). Tugas intensif CPU diteruskan ke inti CPU alternatif alih-alih diproses pada utas tunggal yang memproses semua tugas. Ini juga lebih mudah untuk dikelola jika tidak ada pemrosesan multi-utas yang sebenarnya terjadi juga.

gbjbaanb
sumber
Keren, terima kasih untuk referensi ke teknologi Apple dan Intel. Apakah jawaban Anda menunjukkan tantangan mengelola utas sampai ke inti afinitas? Beberapa masalah kinerja cache diredakan karena prosesor multicore dapat mengulangi cache L1 per inti? Sebagai contoh: software.intel.com/en-us/articles/… Cache berkecepatan tinggi untuk empat core dengan lebih banyak hit cache dapat lebih dari 4x secepat satu core dengan lebih banyak cache yang ketinggalan pada data yang sama. Multiplikasi matriks bisa. Penjadwalan acak 32 thread pada 4 core tidak bisa. Mari kita gunakan afinitas dan dapatkan 32 core.
PengembangDon
tidak benar-benar masalah yang sama - inti afinitas hanya merujuk pada masalah di mana tugas memantul dari inti ke inti. Ini masalah yang sama jika suatu tugas terganggu, diganti dengan yang baru, maka tugas aslinya berlanjut pada inti yang sama. Intel mengatakan di sana: cache hit = cepat, cache misses = lambat, terlepas dari jumlah core. Saya pikir mereka mencoba membujuk Anda untuk membeli chip mereka daripada AMD :)
gbjbaanb