1 Ostatnio edytowany przez Adam Klobukowski (2021-05-06 15:29:29)

Mam taką zagwozdkę, jest tu sporo mądrych ludzi, może ktoś będzie wiedział

Załóżmy że mamy nowoczesny procesor mający 8 rdzeni, 16 wątków. Działa to pod kontrolą typowego OSa, Windows, Linux, whatever.

Na jednym z rdzeni chodzi algorytm który kręci się non-stop i wykorzystuje go jak tylko może.

Algorytm ten bardzo obciąża pamięć i z tego powodu jego instrukcje wykonywane przez CPU muszą czekać dodatkowe cykle (bo cache i pamięć nie dają rady).

I teraz pytanie: czy mierzone obciążenie %CPU (wykazywane przez OS) na tym rdzeniu pokaże 100% czy niższą wartość?

Atari: FireBee, (Falcon030 CT60e SuperVidel SvEthlana CTPCI), TT, (520ST Pak030 Frak PuPla Panther), (520ST 4MB ST RAM 8MB TT RAM CosmosEx SC1435), (1040STFM UltraSatan SM124), (1040STE 4MB ST RAM 8MB TT RAM CosmosEx NetUSBee SM144 SC1224), 260ST, 520 ST+, (MEGA ST SM125), (65XE Rapidus U1MB VBXE SIDE2 SIO2PC), (Jaguar SkunkBoard), Lynx II, 2x Portfolio

2

Pewnie jeden rabin powie tak, drugi rabin powie nie i pies jest pogrzebany pod słowem "whatever" z drugiego akapitu. Założę się, że Windows i Linux mają inne algorytmy mierzenia obciążenia CPU, zresztą, mówiąc o linuksie to co można mieć na myśli? To co drukuje TOP? Tak na chłopski rozum, to ja bym strzelał w 100%, bo "typowy" algorytm wyobrażam sobie jako samplujący w określonych odstępach co robi każdy z rdzeni, Jeżeli rdzeń nie jest w idlu to znaczy że jest używany, a w opisanej przez Ciebie sytuacji raczej do idla nie przejdzie.

3

wydaje mi się że będzie 100% bo procesor cały czas pracuje

Lynx I / Mega ST 1 / 7800 / Portfolio / Lynx II / Jaguar / TT030 / Mega STe / 800 XL / 1040 STe / Falcon030 / 65 XE / 520 STm / SM124 / SC1435
DDD HDD / AT Speed C16 / TF536 / SDrive / PAK68/3 / Lynx Multi Card / LDW Super 2000 / XCA12 / SkunkBoard / CosmosEx / SatanDisk / UltraSatan / USB Floppy Drive Emulator / Eiffel / SIO2PC / Crazy Dots / PAM Net
http://260ste.atari.org

4

Doświadcznie (z Linuksem) pokazuje, że w normalnej sytuacji scheduler potrafi przerzucać wątki między rdzeniami. Zrobiłem sobie właśnie prosty test - na komputerze, na którym teraz pracuję, proces był przerzucany między różnymi rdzeniami (nie ciągle ale co jakiś czas), natomiast na stacji roboczej, któ©a w tej chwili zupełnie nic nie robi, taki sam proces był na sztywno przyklejony do konkretnego rdzenia.
Jeśli chodzi o to, co i gdzie jest przerzucane - znaczenie może mieć architektura procesora bo ten inaczej będzie się zachowywał dla NUMA w AMD, a inaczej na UMA w Intelu (kwestia np. wykorzystania pamięci podręcznej czy adresowania pamięci).
Zawsze można za pomocą affinity "przypiąć" wątek do konkretnego rdzenia, wtedy scheduler nie będzie go migrował. No i zwykle pierwszy rdzeń jest używany dla samych zadań systemowych.

Co do samego pomiaru obciążenia - jeśli rdzeń jest non stop zajęty to jego wykorzystanie będzie 100%.

Pamięć studenta ma charakter kwantowy - student wie wszystko, ale jednocześnie nic nie pamięta.
- Kilka(naście?) pudełek z klawiszami i światełkami. I jeden Vectrex, żeby nimi wszystkimi rządzić.

5

sytuacje mogą komplikować algorytmy które będą starały się wyrównać temperaturę struktury i taki proces migrować między rdzeniami, tak aby nie wytwarzać hot-spotów, lub zdejmować zegar przez throttling
jedne i drugie podejście jest słabe, ale nieuniknione, bo zwyczajnie aktualne produkowane procesory nie są w stanie pracować w trybie ciągłym przy takim taktowaniu jak mają w specyfikacji (no, przynajmniej te pod strzechy - może dla dużych jest z tym lepiej)

przechodze na tumiwisizm

6

Aż mi się przypomniał ten wątek jak trafiłem na takiego artka:

http://www.brendangregg.com/blog/2017-0 … wrong.html

7

laoo/ng napisał/a:

Aż mi się przypomniał ten wątek jak trafiłem na takiego artka:

http://www.brendangregg.com/blog/2017-0 … wrong.html

Sytuacja bardzo charakterystyczna dla, na przykład Raspberry Pi.

Procedura napisana w Pascalu, skompilowana do natywnego kodu, wykonuje się 20 razy wolniej niż robiąca to samo procedura, ale napisana w żywym asemblerze.

Różnica jest taka, że w procedurze pisanej w asm upchałem ile się da zmiennych w rejestry, wykorzystując nawet R14, na co żaden kompilator się nie odważy. Poza tym procedura, po uprzednim zdjęciu blokady dostępu z RAMu wykorzystuje obszar kodu na zmienne lokalne.

Dzięki temu większość operacji procesor robi na rejestrach, od czasu do czasu ładując coś lub zapisując do RAMu pojedynczymi instrukcjami ldr/str

Ponieważ kompilator nie dotknie nie tylko r14, ale jeszcze paru innych, spora część zmiennych w wersji kompilowanej przechowywana jest w pamięci i to w obszarze danych, co powoduje że na jeden dostęp do zmiennej potrzebne są 2 instrukcje ldr/str.

No i procesor stoi, czekając na dane z pamięci - LDR kosztuje w malinie trójce, tak na oko, jakieś 3 nanosekundy. ALU mogłoby w tym czasie wykonać kilka instrukcji, ale nie robi. Bo czeka.

Tylko kto dziś, w czasach wszechobecnego Pythona i Javascriptu, zwraca na to w ogóle uwagę?