felietony

Ryzen 3 3300X kontra Ryzen 3 3100 zegar w zegar – czemu jeden CCX jest szybszy?

28
9 maja 2020, 14:01 Mateusz Brzostek

Dzięki dodatkowym kilku godzinom testów mogłem uzupełnić testy wydajności nowych tanich Ryzenów 3000 o podkręconą „ręcznie” – czyli z wybranym przeze mnie taktowaniem i napięciem, bez użycia PBO ani Auto OC – konfigurację Ryzena 3 3300X. Wyższy z dwóch nowych modeli udało się przyspieszyć również do 4500 MHz, przy nieco wyższym napięciu zasilania (1,33 V). Tak przyspieszony Ryzen 3 3300X jest czasami zaskakująco szybszy od niższego modelu (wykresy w opublikowanym teście zostały zaktualizowane na podstawie wyników tego eksperymentu), choć oba mają takie samo taktowanie:

To nie pomyłka – oba procesory ustawione na taką samą prędkość taktowania, z identycznie taktowaną pamięcią RAM i takimi samymi opóźnieniami mają w niektórych zastosowaniach radykalnie różną wydajność. W eksportowaniu złożonego projektu do dwóch różnych formatów jednocześnie model 3300X był o 30% szybszy, ale nawet po przyspieszeniu obu procesorów zachowuje przewagę ponad 20%! W innych zastosowaniach różnice są dużo mniejsze, ale niektóre gry działają zauważalnie lepiej na procesorze ze wszystkimi rdzeniami w jednym CCX.

System operacyjny wie o różnej budowie tych dwóch procesorów. Co prawda pamięci podręczne są zarządzane sprzętowo (oprogramowanie „widzi” tylko rejestry procesora i jednolitą przestrzeń pamięci, a procesor sam decyduje, która część tej pamięci będzie przechowywana chwilowo w szybkiej, lokalnej pamięci podręcznej), ale żeby ułatwić systemowi operacyjnemu przydzielanie wątków, procesor może przedstawić mu topologię rdzeni i pamięci podręcznych. Oprogramowanie może zatem wiedzieć (bez pewności, że to prawda), jaka jest pojemność i organizacja cache, ale nie może bezpośrednio wpłynąć na to, co jest w niej przechowywane. Na pierwszym zrzucie ekranu widzicie dostępne dla systemu operacyjnego informacje o topologii Ryzena 3300X (jeden CCX), a na drugim – Ryzena 3100 (dwa CCX).

Systemy operacyjne (sprawdziłem Windows 10 i Ubuntu 20.04) biorą te informacje pod uwagę – dwuwątkowy program zostanie przydzielony na Ryzenie 3 3100 do tych procesorów logicznych, które działają w ramach jednego CCX.

Nie do końca wspólna pamięć podręczna L3

Najpoważniejszą konsekwencją takiej budowy procesora jest to, że dla procesu lub grupy procesów działających w ramach jednego CCX druga część pamięci podręcznej L3 często nie ma znaczenia. Jeden wątek może dostać do dyspozycji najwyżej 8 MB danych z prędkością L3 – po większe porcje procesor musi sięgnąć do RAM-u. 

Zwróćcie uwagę na skalę logarytmiczną na obu osiach.

Komunikacja między wątkami czy pojemność pamięci podręcznej?

Co sprawia, że Ryzen 3 3300X jest o tyle wydajniejszy od modelu 3100 – czy to, że komunikacja między niektórymi parami rdzeni w 3100 jest wolniejsza, czy to, że jego pamięć podręczna nie jest wspólna dla wszystkich rdzeni?

Komunikacja między procesorami polega na tym, że działające na nich programy korzystają z tych samych obszarów pamięci. Wyobraźmy sobie dwa rdzenie jako dwóch ludzi symulujących maszyny Turinga, stojących w jednym pomieszczeniu. Każdy z nich trzyma w ręku inny fragment jednej taśmy maszyny Turinga. Nie mogą się skomunikować w żaden inny sposób, niż za pośrednictwem taśmy – w procesorze nie ma kanału komunikacji odpowiadającego rozmowie lub gestykulacji, która nie korzysta z taśmy.

Tych dwóch czynników nie da się odizolować; pamięć podręczna uczestniczy w komunikacji między rdzeniami tak samo jak łącze InfinityFabric.

Numerację wątków zmieniłem na tę odpowiadająca systemom Windows. Procesory logiczne 0 i 1 odpowiadają temu samemu rdzeniowi i mają do siebie najbliżej. 3 i 4 działają na drugim rdzeniu i mają wspólną z 0 i 1 pamięć L3. W Ryzenie 3100 komunikacja wątków 0-3 z wątkami 4-7 trwa dłużej, bo te drugie znajdują się w drugim CCX. Trzeba sięgnąć do jądra CCIO za pośrednictwem łącza InfinityFabric – nie ma bezpośredniej komunikacji pomiędzy dwoma CCX w ramach jednego jądra CCD.

Połączona pula pamięci podręcznej L3 jest w większości przypadków lepsza – zadania małowątkowe mogą mieć w zasięgu szybkiego dostępu całe 16 MB danych. Jednak mogą się zdarzyć osobliwe zadania, w których dwa osobne segmenty pamięci podręcznej L3 dają lepszą wydajność, niż jeden o podwójnej pojemności. Użyteczne dane mogą zostać wyrzucone z pamięci podręcznej z różnych powodów:

  • kiedy inny proces działający na rdzeniu połączonym z ta samą pulą cache potrzebuje innych danych – dwa procesy rywalizują o pojemność cache
  • kiedy świeżo pobierane dane nie wyczerpują pojemności cache, ale mogą być przechowywane tylko w okreśolnym miejscu, bo drożność cache jest za mała – czyli dwa procesy rywalizują o konkretne linie w cache

W ten sposób zbyt dużo czasu zostaje zmarnowane na wielokrotne pobieranie i wyrzucanie danych z cache, i żaden proces nie ma potrzebnych sobie danych dość długo, żeby najlepiej wykorzystać prędkość i bliskość pamięci cache. W programowaniu nazywa się to zjawisko cache thrashing.

Spróbowałem znaleźć jakiś przykład takiego zachowania przeprowadzając mały eksperyment z Blenderem. W procesorze Zen 2 z włączonymi 4 rdzeniami w różnych konfiguracjach pozwoliłem Blenderowi korzystać tylko z 2 wątków przypisanych przez system operacyjny do dowolnych spośród 4 procesorów logicznych. Niebieskie zaznaczenie pokazuje, które zasoby miał do dyspozycji Blender. Windows oczywiście bierze pod uwagę technikę SMT – dwa wątki mające do dyspozycji 4 procesory logiczne zostają przypisane tak, żeby na jednym rdzeniu działał tylko jeden wątek.

Jak można było się spodziewać, najszybsza jest konfiguracja D, w której dwa wątki Blendera mają do dyspozycji po 16 MB L3 każdy. Spośród konfiguracji B i C, które mają do dyspozycji łącznie 16 MB L3, szybsza jest ta, w której jest to wspólne 16 MB. Porównanie A z C oraz B z D pokazuje, że pojemność dostępnej pamięci jest równie ważna, co jej dostępność dla obu procesów. Oczywiście to tylko jeden przykład – na pewno w samym Blenderze znalazłyby się jakieś procedury, które pokazałyby inne zależności w wydajności. Sądzę jednak, że ten przykład wystarczy, żeby pokazać, że dyskusja o ważności jednego czy drugiego z dwóch nierozłącznie związanych czynników nie ma sensu.

Cyrix Cx5x86Zobacz profil
Poziom ostrzeżenia: 0%
Cyrix Cx5x862020.05.09, 15:00
-15#1
Wpis usunięty przez moderatora
Edytowane przez moderatora (2020.05.20, 22:19)
DaviMZobacz profil
Poziom ostrzeżenia: 0%
DaviM2020.05.09, 15:14
31#2
Cyrix Cx5x86 @ 2020.05.09 15:00  Post: 1243162
rzucają się w oczy bardzo duże opóźnienia w komunikacji rdzeni

W oczy to się rzucają ale raczej wiedza, pasja i chęci Mateusza.
darkonzaZobacz profil
Poziom ostrzeżenia: 0%
darkonza2020.05.09, 15:24
18#3
Fajna analiza. Więcej takich!
RaVen01Zobacz profil
Poziom ostrzeżenia: 0%
RaVen012020.05.09, 15:25
'Krzychu 9900k tera'
decorator12Zobacz profil
Poziom ostrzeżenia: 0%
decorator122020.05.09, 15:40
Cyrix Cx5x86 @ 2020.05.09 15:00  Post: 1243162
rzucają się w oczy bardzo duże opóźnienia w komunikacji rdzeni

I tylko to w sumie nie pozwala Ryzenowi orać Intela w grach [no i niższe zegary jeszcze]. Podobno Ryzen 4000 ma mieć 1 CCX z 8 rdzeniami, a nie jak teraz: 1CCX = 4 rdzenie.
AMD jednak zrobi wtedy dokładnie to samo co z 3300X - czyli 8 rdzeni na 1CCX będzie droższe od 8 rdzeni na 2 CCX.
Do tego z tego co kojarzę [ale mogę być w strasznym błędnie :E ] robiono testy 3950X z wyłączonym jednym CCX i wcale jakoś nie powalał wydajnością taki '8core'
Cyrix Cx5x86Zobacz profil
Poziom ostrzeżenia: 0%
Cyrix Cx5x862020.05.09, 16:16
-22#6
Wpis usunięty przez moderatora
Edytowane przez moderatora (2020.05.20, 22:19)
grabenZobacz profil
Poziom ostrzeżenia: 0%
graben2020.05.09, 19:09
Dzięki. Bardzo ciekawa analiza. Daje do myślenia jak komunikacja między rdzeniami wpływa na wydajność. Jak duże są możliwości optymalizacji i ewolucji komunikacji między wieloma rdzeniami obrazuje poniższy materiał
https://www.youtube.com/watch?v=G3kGSbWFig4
Jeśli AMD w kolejnej generacji zastosuje aktywny interposer z komunikacją/logiką w warstwie infinity fabric i lepszymi topologiami komunikacji między rdzeniami (np. butter donut) to będzie się działo i wiele można usprawnić.
NamonakiZobacz profil
Poziom ostrzeżenia: 0%
Namonaki2020.05.09, 19:21
na B450M DS3H z BIOS'em F2 i R5 1600 mam opcje ustawienia konfiguracji rdzeni jako 4+0
czy na Ryzen 3 3100 również jest taka opcja?
a Ryzen 3 3300X opcja 2+2?
SmogsmokZobacz profil
Poziom ostrzeżenia: 0%
Smogsmok2020.05.09, 21:03
decorator12 @ 2020.05.09 15:40  Post: 1243169
[quote name='Cyrix Cx5x86' date='2020.05.09 15:00' post='1243162'
Do tego z tego co kojarzę [ale mogę być w strasznym błędnie :E ] robiono testy 3950X z wyłączonym jednym CCX i wcale jakoś nie powalał wydajnością taki '8core'

Oczywiście, że możesz się mylić, właśnie to zrobiłeś. 3950x ma 2CCD po 2 CCX w każdym CCD co daje 4x4CCX dlatego ssie w grach tak sam jak 3700x.
Wszystkie procesory Zen2 to sklejki CCD oraz CCX, jedynie 3300x ma włączone rdzenie tylko w obrębie jednego ccx
Edytowane przez autora (2020.05.09, 21:05)
Super8Zobacz profil
Poziom ostrzeżenia: 0%
Super82020.05.09, 21:58
Czyli AMD zaorało już Intela w grach... no prawie. xD
Funkcja komentowania została wyłączona. Do dyskusji zapraszamy na forum.
1