Bisakah beberapa CPU / core mengakses RAM yang sama secara bersamaan?

15

Inilah yang saya kira akan terjadi:

  1. Jika dua core mencoba mengakses alamat yang sama dalam RAM, yang satu harus menunggu yang lain untuk mengakses RAM. Kali kedua setiap inti akan mencoba mengakses alamat yang sama, mereka mungkin masih memiliki cache cache, sehingga mereka dapat mengakses cache masing-masing secara bersamaan .

  2. Jika dua core mencoba mengakses alamat yang berbeda dalam RAM yang sama, yang satu harus menunggu yang lain untuk mengakses RAM.

Dengan kata lain, saya akan membayangkan bahwa untuk tugas pemrograman intensif RAM, multiprosesor tidak akan banyak membantu kecuali itu melibatkan membaca dari alamat yang sama dalam RAM beberapa kali per inti.

Jadi, dapatkah beberapa CPU / core mengakses RAM yang sama secara simultan, atau apakah yang saya katakan benar?

Hobbit yang Hilang
sumber
Saya tidak dapat berbicara dengan tingkat perangkat keras yang Anda maksudkan, tetapi saya dapat mengatakan bahwa tugas intensif dapat dibantu dengan multiprocessing dengan hanya membagi penggunaannya; artinya jika Anda memiliki 500mb data ram yang Anda perlu diproses, berikan 250mb data / ram tersebut ke satu proc dan 250mb ke yang lain dan Anda telah secara efektif menggandakan throughput yang mungkin Anda miliki (pembatasan bandwidth ram tidak bertahan). Selain apakah perangkat keras dapat melakukannya atau tidak, memiliki beberapa prosesor yang mengakses alamat ram yang sama adalah ide yang benar-benar buruk, dan sebagian besar kode multi-proc dengan susah payah berusaha menghindarinya.
Jimmy Hoffa
1
@JimmyHoffa Tapi pembatasan bandwidth RAM adalah persis apa yang dia bicarakan (karena asumsinya adalah bahwa tugasnya adalah memori-terikat).
@ Jimmy Saya tidak melihat masalah dengan dua prosesor yang mencoba membaca dari alamat RAM yang sama. Saya hanya akan melihat masalah jika mereka mencoba menulis pada saat yang sama.
Lost Hobbit
1
pada prosesor multicore tertentu yang saya gunakan untuk bekerja, core tidak "tahu" apa pun di luar cache lokal mereka; hal-hal yang perlu disinkronkan dengan cache bersama dilakukan secara transparan untuk ini dalam jumlah tertentu dari siklus prosesor; programmer bersedia untuk memperhitungkan ini hanya secara manual menambahkan jumlah yang diperlukan nopdalam kode assembly
nyamuk
2
Jawaban singkat: tergantung pada arsitektur bus sistem Anda, protokol koherensi cache, jumlah port pada pengontrol DDR Anda dan jumlah pengontrol DDR. Jawaban panjang ada di lembar data sistem Anda.
SK-logic

Jawaban:

11

Rangkuman: secara umum dimungkinkan untuk sebuah inti tunggal untuk menjenuhkan bus memori jika hanya itu yang bisa dilakukan.

Jika Anda menetapkan bandwidth memori mesin Anda, Anda harus dapat melihat apakah proses single-threaded benar-benar dapat mencapai ini dan, jika tidak, bagaimana bandwidth yang efektif menggunakan skala dengan jumlah prosesor.


Detailnya akan tergantung pada arsitektur yang Anda gunakan. Dengan asumsi sesuatu seperti SMP dan SDRAM modern:

  1. Jika dua core mencoba mengakses alamat yang sama dalam RAM ...

    bisa beberapa cara:

    • mereka berdua ingin membaca secara bersamaan:

      • dua core pada chip yang sama mungkin akan berbagi cache perantara pada tingkat tertentu (2 atau 3), jadi pembacaan hanya akan dilakukan sekali. Pada arsitektur modern, masing-masing inti mungkin dapat tetap menjalankan µ-ops dari satu atau lebih jalur pipa sampai garis cache siap
      • dua core pada chip yang berbeda mungkin tidak berbagi cache, tetapi masih perlu mengoordinasikan akses ke bus: idealnya, chip mana pun yang tidak terbaca akan hanya mengintai respons
    • jika mereka berdua ingin menulis:

      • dua core pada chip yang sama hanya akan menulis ke cache yang sama, dan itu hanya perlu disiram ke RAM sekali. Bahkan, karena memori akan dibaca dari dan ditulis ke RAM per baris cache, menulis di alamat yang berbeda tetapi cukup dekat dapat digabungkan menjadi satu tulis ke RAM

      • dua core pada chip yang berbeda memiliki konflik, dan baris cache perlu ditulis kembali ke RAM oleh chip1, diambil ke dalam cache chip2, dimodifikasi dan kemudian ditulis kembali (tidak tahu apakah penulisan / pengambilan dapat dikoordinasikan dengan mengintip)

  2. Jika dua core mencoba mengakses alamat yang berbeda ...

    Untuk satu akses, latensi CAS berarti dua operasi berpotensi disisipkan untuk mengambil tidak lebih lama (atau mungkin hanya sedikit lebih lama) daripada jika bus diam.

Tak berguna
sumber
Item daftar lainnya adalah ketika satu core memulai transfer DMA sementara core lain menyodok pada area target.
ott--
7

Jadi, dapatkah beberapa CPU / core mengakses RAM yang sama secara simultan, atau apakah yang saya katakan benar?

Ada banyak arsitektur mesin yang berbeda di luar sana, masing-masing dengan set fitur sendiri. Salah satu kategori mesin multi- pemrosesan disebut MISD , untuk Multiple Instruction Single Data, dan mesin tersebut dirancang untuk memberikan data yang sama ke beberapa prosesor sekaligus. Kelas mesin terkait yang dikenal sebagai arsitektur SIMD (Single Instruction Multiple Data) jauh lebih umum dan juga menyediakan akses ke memori yang sama pada saat yang sama, tetapi memori tersebut berisi instruksi alih-alih data. Baik dalam MIMD dan SIMD, "akses" berarti akses baca - Anda dapat membayangkan masalah yang akan Anda alami jika dua unit mencoba menulis ke lokasi yang sama secara bersamaan!

Caleb
sumber
3

Meskipun sebagian besar jawaban mendekati dari sisi perangkat lunak dan / atau model perangkat keras, cara terbersih adalah dengan mempertimbangkan cara kerja chip RAM fisik. (Cache terletak di antara prosesor dan memori, dan hanya menggunakan bus alamat yang sama, dan operasinya benar-benar transparan untuk prosesor.) Chip RAM memiliki satu decoder alamat tunggal, yang menerima alamat sel memori, tiba di bus alamat (dan juga bus data, baik masuk atau keluar). Memori yang ada dibangun dalam "pendekatan prosesor tunggal", yaitu satu prosesor dihubungkan melalui satu bus ke satu chip memori. Dengan kata lain, ini adalah "von Neumann bottleneck", karena setiap instruksi harus merujuk memori setidaknya satu kali. Karena itu, pada satu kabel (atau kabel, alias bus) hanya satu sinyal yang mungkin ada pada suatu waktu, jadi chip RAM dapat menerima satu alamat sel pada satu waktu. Sampai Anda dapat memastikan dua core memasukkan alamat yang sama ke bus alamat, akses bus simultan oleh dua pengemudi bus yang berbeda (seperti core) secara fisik tidak mungkin. (Dan, jika itu sama, itu mubazir).

Sisanya adalah akselerasi perangkat keras yang disebut. Bus koherensi, cache, akses SIMD, dll. Hanyalah beberapa fasad yang bagus di depan RAM fisik, pertanyaan Anda adalah tentang. Akselerator yang disebutkan mungkin mencakup perjuangan untuk menggunakan bus alamat secara eksklusif, dan model pemrograman tidak banyak berhubungan dengan pertanyaan Anda. Juga perhatikan bahwa akses simultan juga akan bertentangan dengan abstraksi "ruang alamat pribadi".

Jadi, untuk pertanyaan Anda: akses RAM langsung simultan tidak mungkin, baik dengan alamat yang sama maupun berbeda. Menggunakan cache mungkin mencakup fakta ini dan mungkin memungkinkan akses simultan dalam beberapa kasus. Itu tergantung pada tingkat cache dan konstruksi, serta lokalitas spasial dan temporal data Anda. Dan ya, Anda benar: pemrosesan multi (inti) tanpa peningkatan akses RAM, tidak akan banyak membantu untuk aplikasi intensif RAM.

Untuk pemahaman yang lebih baik: cukup ingat cara kerja Akses Memori Langsung. Baik CPU dan perangkat DMA dapat menempatkan alamat ke bus, sehingga harus mengeluarkan satu sama lain dari penggunaan bus secara simultan.

katang
sumber
1

Anda tidak peduli tentang RAM fisik, Anda lebih peduli virtual memory dan ruang alamat dari proses atau thread (semua benang dari proses berbagi yang sama ruang alamat umum) dalam praktek.

Tentu saja jika Anda mengkode kernel sistem operasi multi-core, Anda sangat peduli dengan RAM dan cache koherensi.

Sebagian besar prosesor multi-inti memiliki beberapa bentuk mekanisme koherensi cache . Detail spesifik untuk prosesor. Karena prosesor menggunakan cache CPU , mereka kadang-kadang berperilaku seolah-olah beberapa inti prosesor mengakses lokasi memori yang sama secara bersamaan.

Standar bahasa industri terkini seperti C11 atau C ++ 11 memiliki beberapa model memori (multi-thread aware) .

Basile Starynkevitch
sumber
0

CPU modern terikat secara fisik dengan perangkat memori eksternal mereka untuk mendapatkan bandwidth transfer data maksimum. Ini karena persyaratan integritas sinyal (panjang jejak, penghentian, kemiringan jam, dll.) Yang diperlukan untuk mempertahankan tingkat transfer yang tinggi. Misalnya, pada motherboard multi-CPU, setiap CPU memiliki set slot DIMM khusus. Terlepas dari apa yang dipikirkan oleh pemrogram perangkat lunak, satu CPU tidak dapat dengan mudah mengakses data memori eksternal dari CPU lain. Perangkat lunak manajemen memori sistem, baik pada level kernel OS, Hypervisor, core data plane, atau lainnya, menangani transfer data memori antar-CPU.

Jeff Brower
sumber
1
posting ini agak sulit dibaca (dinding teks). Maukah Anda mengeditnya menjadi bentuk yang lebih baik?
nyamuk