Czy wiele procesorów / rdzeni może jednocześnie uzyskiwać dostęp do tej samej pamięci RAM?

16

Wydaje mi się, że tak się stanie:

  1. Gdyby dwa rdzenie próbowały uzyskać dostęp do tego samego adresu w pamięci RAM, jeden musiałby poczekać , aż drugi uzyska dostęp do pamięci RAM. Za drugim razem, gdy każdy rdzeń będzie próbował uzyskać dostęp do tego samego adresu, mogą nadal mieć pamięć podręczną RAM, aby mogły jednocześnie uzyskiwać dostęp do odpowiednich pamięci podręcznych .

  2. Gdyby dwa rdzenie próbowały uzyskać dostęp do różnych adresów w tej samej pamięci RAM, jeden musiałby poczekać , aż drugi uzyska dostęp do pamięci RAM.

Innymi słowy, wyobrażam sobie, że w przypadku zadań intensywnie programujących pamięć RAM przetwarzanie wieloprocesowe niewiele pomoże, chyba że wymagałoby wielokrotnego odczytu z tego samego adresu w pamięci RAM na rdzeń.

Czy zatem wiele procesorów / rdzeni może uzyskać dostęp do tej samej pamięci RAM jednocześnie, czy też to, co mówię, jest prawidłowe?

Lost Hobbit
źródło
Nie mogę mówić o poziomie sprzętu, o którym mówisz, ale mogę powiedzieć, że zadania intensywnie korzystające z pamięci RAM mogą być wspomagane przez przetwarzanie wieloprocesowe, po prostu dzieląc użycie; to znaczy, jeśli masz 500 MB danych w pamięci RAM, którą potrzebujesz przetworzyć, przekaż 250 MB tych danych / pamięci RAM jednemu procesowi, a 250 MB innej, a efektywnie podwoisz możliwą przepustowość (ograniczenia przepustowości pamięci RAM nie są w stanie wytrzymać). Poza tym, czy sprzęt może to zrobić, posiadanie wielu procesorów uzyskujących dostęp do tego samego adresu pamięci RAM jest naprawdę złym pomysłem, a większość kodu wieloprocesowego stara się go unikać.
Jimmy Hoffa
1
@ JimmyHoffa Ale ograniczenia przepustowości pamięci RAM są dokładnie tym, o czym on mówi (ponieważ zakłada się, że zadanie jest związane z pamięcią).
@ Jimmy Nie widzę problemu z dwoma procesorami próbującymi czytać z tego samego adresu RAM. Widziałbym problem tylko wtedy, gdyby spróbowali napisać do niego w tym samym czasie.
Lost Hobbit,
1
na konkretnym procesorze wielordzeniowym, z którym kiedyś pracowałem, rdzenie nie „wiedziały” niczego poza lokalnymi pamięciami podręcznymi; rzeczy, które musiały zostać zsynchronizowane ze współdzieloną pamięcią podręczną, były wykonywane w sposób transparentny wobec nich w określonej liczbie cyklów procesora; programista, który chce wziąć to pod uwagę, właśnie ręcznie dodał potrzebną ilość nops w swoim kodzie asemblera
gnat
2
Krótka odpowiedź: zależy od architektury magistrali systemowej, protokołu spójności pamięci podręcznej, liczby portów w kontrolerze DDR i liczby kontrolerów DDR. Długa odpowiedź znajduje się w arkuszu danych systemu.
SK-logic

Odpowiedzi:

11

Podsumowanie: generalnie możliwe jest, aby pojedynczy rdzeń nasycił magistralę pamięci, jeśli dostęp do pamięci jest wszystkim, co robi.

Jeśli ustalisz przepustowość pamięci swojego komputera, powinieneś być w stanie sprawdzić, czy proces jednowątkowy naprawdę może to osiągnąć, a jeśli nie, w jaki sposób efektywne wykorzystanie przepustowości skaluje się z liczbą procesorów.


Szczegóły będą zależeć od używanej architektury. Zakładając coś w rodzaju nowoczesnego SMP i SDRAM:

  1. Jeśli dwa rdzenie próbują uzyskać dostęp do tego samego adresu w pamięci RAM ...

    może iść na kilka sposobów:

    • oboje chcą czytać jednocześnie:

      • dwa rdzenie na tym samym chipie prawdopodobnie będą dzielić pośrednią pamięć podręczną na pewnym poziomie (2 lub 3), więc odczyt zostanie wykonany tylko raz. W nowoczesnej architekturze każdy rdzeń może być w stanie wykonywać µ-ops z jednego lub więcej potoków, dopóki linia pamięci podręcznej nie będzie gotowa
      • dwa rdzenie na różnych układach mogą nie współdzielić pamięci podręcznej, ale nadal muszą koordynować dostęp do magistrali: idealnie, którykolwiek układ nie wydał odczytu, po prostu podsłuchi odpowiedź
    • jeśli oboje chcą pisać:

      • dwa rdzenie na tym samym układzie będą po prostu zapisywać w tej samej pamięci podręcznej, a to musi zostać tylko raz zapisane w pamięci RAM. W rzeczywistości, ponieważ pamięć będzie odczytywana i zapisywana w pamięci RAM na linię pamięci podręcznej, zapisy w odrębnych, ale wystarczająco bliskich adresach mogą zostać połączone w pojedynczy zapis do pamięci RAM

      • dwa rdzenie na różnych układach mają konflikt, a linia pamięci podręcznej będzie musiała zostać zapisana z powrotem do pamięci RAM przez układ 1, pobrana do pamięci podręcznej układu 2, zmodyfikowana, a następnie ponownie zapisana (nie mam pojęcia, czy zapis / pobieranie można połączyć ze sobą przez szpiegowanie)

  2. Jeśli dwa rdzenie próbują uzyskać dostęp do różnych adresów ...

    W przypadku pojedynczego dostępu opóźnienie CAS oznacza, że ​​dwie operacje mogą być potencjalnie przeplatane, aby nie trwały dłużej (a może tylko trochę dłużej) niż gdyby autobus był bezczynny.

Nieprzydatny
źródło
Inną pozycją na liście jest sytuacja, gdy jeden rdzeń inicjuje transfer DMA, podczas gdy inny rdzeń szturcha obszar docelowy.
ott--
7

Czy zatem wiele procesorów / rdzeni może uzyskać dostęp do tej samej pamięci RAM jednocześnie, czy też to, co mówię, jest prawidłowe?

Istnieje wiele różnych architektur maszyn, z których każda ma własny zestaw funkcji. Jedna kategoria maszyn wieloprocesowych nazywa się MISD , dla danych z wieloma instrukcjami pojedynczych, i takie maszyny są zaprojektowane tak, aby zapewniały te same dane kilku procesorom jednocześnie. Powiązana klasa maszyn zwana architekturami SIMD (Single Instruction Multiple Data) jest znacznie bardziej powszechna i zapewnia dostęp do tej samej pamięci w tym samym czasie, ale pamięć zawiera instrukcje zamiast danych. Zarówno w trybie MIMD, jak i SIMD „dostęp” oznacza dostęp do odczytu - możesz sobie wyobrazić kłopoty, które wystąpiłyby, gdyby dwie jednostki próbowały pisać w tym samym miejscu w tym samym czasie!

Caleb
źródło
3

Chociaż większość odpowiedzi pojawia się od strony oprogramowania i / lub modelu sprzętowego, najczystszym sposobem jest rozważenie działania fizycznych układów pamięci RAM. (Pamięć podręczna znajduje się między procesorem a pamięcią i po prostu używa tej samej magistrali adresowej, a jej działanie jest całkowicie przezroczyste dla procesora.) Układy RAM mają jeden dekoder adresu, który odbiera adres komórki pamięci, przybywając na magistrala adresowa (i podobnie magistrala danych, wejściowa lub wyjściowa). Obecne pamięci są wbudowane w „podejście jednoprocesorowe”, tzn. Jeden procesor jest podłączony jedną magistralą do jednego układu pamięci. Innymi słowy, jest to „wąskie gardło von Neumanna”, ponieważ każda instrukcja musi odwoływać się do pamięci przynajmniej raz. Z tego powodu na jednym przewodzie (lub przewodach, czyli szynie) może występować tylko jeden sygnał na raz, więc układ RAM może odbierać jeden adres komórki na raz. Dopóki nie upewnisz się, że dwa rdzenie ustawią ten sam adres na magistrali adresowej, jednoczesny dostęp do magistrali przez dwóch różnych sterowników magistrali (takich jak rdzenie) jest fizycznie niemożliwy. (A jeśli jest to to samo, jest zbędne).

Reszta to tak zwane przyspieszenie sprzętowe. Magistrala koherencji, pamięć podręczna, dostęp do karty SIM itp. To tylko niektóre fajne fasady przed fizyczną pamięcią RAM, o które pytałeś. Wspomniane akceleratory mogą obejmować wyłącznie walkę o użycie magistrali adresowej, a modele programowania nie mają wiele wspólnego z twoim pytaniem. Należy również zauważyć, że jednoczesny dostęp byłby również sprzeczny z abstrakcyjną „prywatną przestrzenią adresową”.

Tak więc na twoje pytania: jednoczesny bezpośredni dostęp do pamięci RAM nie jest możliwy, ani z tym samym, ani z różnymi adresami. Korzystanie z pamięci podręcznej może zasłaniać ten fakt i w niektórych przypadkach umożliwiać pozornie jednoczesny dostęp. Zależy to od poziomu pamięci podręcznej i konstrukcji, a także od przestrzennej i czasowej lokalizacji danych. I tak, masz rację: przetwarzanie wielordzeniowe bez zwiększonego dostępu do pamięci RAM nie pomoże w przypadku aplikacji wymagających dużej ilości pamięci RAM.

Dla lepszego zrozumienia: przypomnij sobie, jak działa bezpośredni dostęp do pamięci. Zarówno procesor, jak i urządzenie DMA mogą umieszczać adres na magistrali, więc muszą się wzajemnie wykluczać z jednoczesnego korzystania z magistrali.

katang
źródło
1

Nie dbasz o fizycznej pamięci RAM, dbasz bardziej o pamięci wirtualnej i przestrzeni adresowej z procesów lub wątków (wszystkie gwinty samego udziału procesowego wspólna przestrzeń adresowa) w praktyce.

Oczywiście, jeśli kodujesz wielordzeniowe jądro systemu operacyjnego, bardzo zależy ci na pamięci RAM i spójności pamięci podręcznej.

Większość procesorów wielordzeniowych ma jakiś mechanizm koherencji pamięci podręcznej . Szczegóły są specyficzne dla procesora. Ponieważ procesor korzysta z pamięci podręcznej procesora , czasami zachowuje się tak, jakby kilka rdzeni procesora jednocześnie uzyskiwało dostęp do tej samej lokalizacji pamięci.

Najnowsze standardy języków przemysłowych, takich jak C11 lub C ++ 11, mają pewien model pamięci (obsługujący wiele wątków) .

Basile Starynkevitch
źródło
0

Nowoczesne procesory są fizycznie powiązane z zewnętrznymi urządzeniami pamięci w celu uzyskania maksymalnej przepustowości transferu danych. Wynika to z wymagań integralności sygnału (długość śladu, zakończenie, pochylenie zegara itp.) Niezbędnych do utrzymania wysokich prędkości transferu. Na przykład na płycie głównej z wieloma procesorami każdy procesor ma dedykowany zestaw gniazd DIMM. Niezależnie od tego, co myślą programiści oprogramowania, jeden procesor nie może po prostu uzyskać dostępu do danych pamięci zewnętrznej innego procesora. Oprogramowanie do zarządzania pamięcią systemu, czy to na poziomie jądra systemu operacyjnego, Hypervisora, rdzeni płaszczyzny danych, czy w inny sposób, obsługuje transfer danych między procesorami.

Jeff Brower
źródło
1
ten post jest raczej trudny do odczytania (ściana tekstu). Czy mógłbyś edytować go w lepszym kształcie?
komara