CPU. Jak wybrać najlepszy komputer?

2021/05/06

Każdy z nas staje czasem przed pytaniem: jak wybrać najlepszy komputer dla naszych domowych celów? Wyboru tego dokonywałem w życiu z 10 razy, gdy każdy z komputerów służył mi przez jakieś 3-5 lat. Nie zawsze były to głeboko przemyślane i optymalne wybory. Być może ten tekst ułatwi Wam podjęcie rozsądnej decyzji, poprzez implementację analizy rynku i pewnego strategicznego planowania.

Nade wszystko należy odpowiedzieć sobie na pytania:

Dla mnie dpowiedź na pytanie pierwsze jest prosta: chciałbym mieć możliwość sprawniejszego prowadzenia testowych symulacji naukowych przy pomocy domowego komputera z wykorzystaniem konkretnego oprogramowania o nazwie LAMMPS. Nie interesują mnie rozwiązania oferujące szczególne możliwości z dziedziny gier, zaś typowe zadania biurowe w miarę dobry komputer i tak będzie w stanie wykonywać sprawnie.

Drugie pytanie jest istotne. Oczywiście, chcielibyśmy najlepszy z możliwych, ale barierą jest koszt. Czyli najlepszy to będzie taki, który zoptymalizuje (subiektywnie) stosunek kosztu do oczekiwanych możliwości maszyny. No chyba, że ktoś ma forsę, zaś komputer kupuje po to, aby popisywać się przed koleżankami. Wbrew pozorom, ten typ zachowań w społeczeństwach występuje często. W takiej powiedzmy Mongolii, kraju dość prymitywnym kulturowo, przyjęte jest, aby czy to młodzieniec czy staruszek posługiwał się na codzień ostatnim modelem smartfona za 1000 US$… To świadczy u nich o statusie społecznym. Podobnie ponoć i w Afryce: kupują drogiego smartfona, który należy doładowywać co kilka dni w wiosce o kilkanaście kilometrów, dokąd trzeba dojechać rowerem i gdzie znajomy spec posiada dynamo napędzane siłą mięsni…

W moim przypadku kryterium wyboru jest rzeczywisty stosunek możliwości do ceny urządzenia.

Na ten przykład: nowe urządzenia są drogie. Ale za rok lub dwa ich cena może spaść do połowy. Choć istnieje wiele czynników rynkowych wpływających na koszt CPU, ogólnie istnieje wśród specjalistów zgoda, że średni roczny spadek ceny wynosi około 30%. Lepiej udokumentowane są zmiany kosztów obliczeniowych. Ocenia się, że 10-ciokrotny spadek kosztów następuję w okresie około 5.6 lat (trends-in-the-cost-of-computing).

Po co więc kupować nowe, gdy można kupić za połowę ceny już odrobinę przestarzałe, a które z powodzeniem będzie mi służyć przez następne 5 lat?

Po co miałbym kupować laptop do użytku domowego, gdy za podobną cenę komputer typu desktop ma zwykle 2 razy lepsze parametry?

Niechaj najpierw porównam sprawność obliczeniową dostępnych w moim otoczeniu procesorów. Chciałbym też porównać otrzymaną z pomiarów sprawność z dostępnymi w internecie parametrami charakteryzującymi te konkretne procesory, po to, aby zorientować się, na ile owe parametry dostępne w internecie są wiarygodne i czy oby nie mogłyby być pomocne w wyborze procesora lepszego, niż mój domowy.

Porównawcza ocena możliwości CPU

Jako że interesują mnie nade wszystko zdolności obliczeniowe w LAMMPS, czyli, kolokwialnie, moc obliczeniowa procesora- z tego też powodu użyję testów właśnie z wykorzystaniem LAMMPS. Nie sądzę, by ktokolwiek z czytających miał chęć powtórzenia moich testów (konieczna byłaby instalacja LAMMPS, rzecz wcale nie tak znowu całkiem trywialna). Tym niemniej, dla porządku podaję oto w jaki sposób owe testy wykonałem (każdy może sobie je przeprowadzić w całkiem inny sposób, oby tylko rozsądnie i oby miał z grubsza chociaż pojęcie o tym, co robi).

Wykonałem trzy testy z pomocą skryptów TEST 1, TEST 2 i TEST 3. Do wykonania testów potrzebne jest umieszczenie w tym samym folderze co owe skrypty także dodatkowego pliku. Testy 1,2,3 róznią się miedzy sobą. W przypadku Testu 2 potrzebne jest około 3.5 raza więcej pamięci i obliczeń niż dla Testu 1, zaś w przypadku Testu 3 dodatkowo, w porównaniu z Testem 2, zapisywana jest na dysku duża ilość danych.

Sednem testów jest to, iż badam zależność czasu ich wykonania od ilości wykorzystanych w obliczeniach rdzeni obliczeniowych (cores). Nie wątków (threads) a właśnie rdzeni obliczeniowych. Korzystanie z wydajności wątków obliczeniowych jest mniej wiarygodne. Ponadto dostępne w internecie dane o wydajności CPU zupełnie ignorują ilość możliwych wątków.

Nie każdy program komputerowy nadaje się do podobnych testów. Większość programów nie jest napisana do pracy równoległej na kilku rdzeniach obliczeniowych. LAMMPS posiada taką możliwość. Obliczenia wykonuję na Linuksie (podobne można zrobić także na Windows).

Używam następującej komendy (z okienka terminala):

>>>
                mpirun -np N lammps -in 1.in

Gdzie 1.in to nazwa pliku wejściowego do obliczeń dla Testu 1 (odpowiednio, byłby to 2.in oraz 3.in dla Testu 2 i Testu 3). N powyżej to liczba rdzeni obliczeniowych, jakie zadaję do wykorzystania (N startuje od 1 aż do maksymalnej dostępnej ilości rdzeni, w moim przypadku, w zalezności od komputera, te maksymalne wartości N wynoszą 4, 2 i 8; Zobacz Tabelę 1).

Tabela 1 Testowane procesory.

Nazwa CPU

# rdzeni

CPU Mark

CPU Mark/ rdzeń

ARMv7 Processor rev 4 (v7l)

4

362

93

Intel(R) Celeron(R) N2840 2.16GHz

2

584

292

Intel Core i7-6700K @4.00GHz

8

8974

1122

Intel Core i5-4690 @3.50GHz

4

5600

1400

Na Linuksie jednym z możliwych sposobów poznania parametrów procesora jest wykonanie komendy:

>>>
                cat /proc/cpuinfo

Oto poniżej przykładowy wynik tej komendy na jednym z moich laptopów (podaję jedynie część naistotniejszych informacji):

>>>
        vendor_id       : GenuineIntel
        model name      : Intel(R) Celeron(R) CPU  N2840  @ 2.16GHz
        cpu MHz         : 2555.408
        cache size      : 1024 KB

Czas wykonania w funkcji wykorzystanych rdzeni.

Wyniki testów przedstawiają rysunki 1 oraz 2. Okazuje się, że wszystkie wyniki mozna dobrze opisać funkcją:

\[t=A+B/N\]

gdzie t jest czasem wykonania testu, zaś N jest liczbą wykorzystanych rdzeni obliczeniowych.

_images/cpu1.png _images/cpu2.png _images/empty760x5.png

Rysunek 1 (z lewej). Czas wykonania Testu 1 dla trzech procesorów w zależności od ilości wykorzystanych rdzeni obliczeniowych. Linie ciągłe zostały dopasowane według funkcji \(t=A+B/N\).

Rysunek 2 (z prawej) Porównanie czasu wykonania Testu 1, 2 i 3 dla dwóch procesorów w zależności od ilości wykorzystanych rdzeni obliczeniowych. Linie ciągłe zostały dopasowane według funkcji \(t=A+B/N\).

Przedstawioną postać zależności \(t(N)\) łatwo jest zrozumieć. Każde z zadań jakie ma do wykonania komputer można podzielić dla dwie kategorie operacji. Pierwsza, to będą takie, które wymagają na przykład:

  • odczytania kodu testu z dysku (plus ewentualnie jego wewnętrznej kompilacji);

  • zapisu wyników na dysku;

  • kontrola nad operacją wszystkich rdzeni obliczeniowych.

Tego rodzaju operacje są operacjami, które muszą być wykonane w trybie szeregowym, to jest jedna po drugiej. Ilość użytych rdzeni obliczeniowych jest w ich przypadku nieistotana: zawsze są one wykonywane przez jeden rdzeń, gdy pozostałe rdzenie są nieaktywne.

Druga kategoria zadań wykonywanych przez procesor to takie, które można rodzielić na oddzielne rdzenie CPU. Czas wykonania operacji potrzebnych przez jeden rdzeń będzie więc proporcjonalny do \(1/N\), bowiem każdy z nich wykonuje tylko \(1/N\) część obliczeń. W ten przynajmniej sposób działa program LAMMPS (to od programistów, którzy napisali dany program, zależy, czy ich kod rzeczywiście potrafi optymalnie wykorzystać dostępne rdzenie obliczeniowe).

W Tabeli 1 znajdziemy kolumnę o nazwie CPU Mark. Liczby wpisane w niej pochodzą z cpubenchmark.net: należy tam wyszukać CPU Mark dla każdego z używanych procesorów:

CPU Mark dobrze opisuje moc obliczeniową każdego z procesorów (celem niniejszego testu było m.in. sprawdzenie, na ile wartości tego parametru są wiarygodne i na ile można je skorelować z wynikami tego testu).

Podobne porównanie pokazane jest na Rysunku 3, na podstawie wyników Testu 1. Okazuje się, że \(1/B\) jest liniową funkcją wielkości CPU Mark / rdzeń podawanej na wymienionej stronie internetowej. \(1/AN\) jest również opisywane tą samą liniową zależnością (w tym przypadku dostajemy \(y=x/7800\)). Dla Test 2 i Test 3 obserwuję podobne zależności, z innymi nachyleniami linii prostej.

_images/cpu4.png _images/empty760x5.png _images/empty760x5.png _images/empty760x5.png

Rysunek 3. Zależność parametrów funkcji t=A+B/N od CPU Mark / rdzeń dla Testu 1.

_images/empty760x5.png _images/empty760x5.png _images/empty760x5.png
Tabela 2 Paremetry funkcji \(t=A+B/N\) dla Testu 1.

CPU

A [s]

B [s]

cores

CPUMark/core

ARMv7

7.7

26.6

4

93

N2840 @2.16GHz

19.5

75.33

2

292

i7-6700K @4.00GHz

1

7

8

1122

i5-4690 @3.50GHz

2.3

26.7

4

1400

_images/empty760x5.png

Porównanie z dostępnymi procesorami.

_images/intelCoreI7.webp

Oczywistym jest, że dla maksymalizacji wydajności obliczeń chcielibyśmy wykorzystać procesor, który ma największy stosunek parametru CPU Mark do ceny procesora. W praktyce zmuszeni jesteśmy porównywać nie tyle ceny samych procesorów, co dostępnych gotowych rozwiązań (płytek PCB z procesorem, czy samych laptopów; warto zwrócić uwagę, że zwykle cena płytki czy komputera będzie skalować się liniowo wraz z ceną rynkową samego procesora).

Procesor ARMv7 testowany tutaj to po prostu Raspberry Pi 3B (4 rdzenie obliczeniowe), wykorzystany wcześniej przeze mnie do zbudowania domowego serwera NFS, dla przechowywania przede wszystkim filmów. Jego parametr CPU Mark wynosi 362, zaś cena (całej płytki ze wszystkimi potrzebnymi akcesoriami) wynosi obecnie coś około 250 zł. Stosunek CPU Mark do ceny wyniósłby więc około 1.45.

Procesor N2840 użyty tutaj do testowania to procesor z mojego (już dość przestarzałego) laptopa niezbyt wysokiej klasy, Lenovo ideapad 100. Przy jego obecnej cenie rynkowej rzedu 500-700 zł oraz CPU Mark 584, dostajemy stosunek CPU Mark do ceny około 1.0. Innym słowy wiekszy ma sens wykorzystanie Raspberry Pi.

Jednakowoż, mój domowy laptop to już przeżytek. Jego moc obliczeniowa jest rzędu 10 razy mniejsza od tej, którą posiadają przeciętnie używane komputerki domowe. Obecnie tańsze modele nowych laptopów maja CPU Mark procesora rzędu 8000 przy cenie rzędu 2000 zł, co daje stosunek CPU Mark do ceny (w zł) rzędu 4.

Z prawej zdjęcie najbardziej wydajnego procesora testowanego tutaj, Intel Core i7-6700K @4.00GHz (mam do niego dostęp w pracy). Przy 8 rdzeniach obliczeniowych posiada CPU Mark 8974. Cztery czy pięć lat temu było to urządzenie niewątpliwie nie dość, że drogie, to i o wielkich możliwościach. Dzisiaj nowy laptop niższej klasy o podobnych możliwościach będzie kosztował rzędu 2000 zł.

Porównajmy Intel Core i7-6700K @4.00GHz z innymi procesorami.

_images/benchmark00.png

Rysunek 4. Porównanie CPU value dla procesora Intel Core i7-6700K @4.00GHz z innymi procesorami. Na podstawie cpubenchmark.net.

_images/benchmark04.png

Rysunek 5. Porównanie CPU Mark dla procesora Intel Core i7-6700K @4.00GHz z innymi procesorami. Na podstawie cpubenchmark.net. Obecnie procesor ma możliwości porównywalne z tymi, jakie maja średniej lub nawet niższej klasy nowe laptopy.

_images/benchmark03.png

Rysunek 6. Lista kilkunastu najbardziej atrakcyjnych cenowo procesorów, charakteryzujących się najwiekszym stosunkiem CPU Mark do ceny. Na podstawie cpubenchmark.net. Warto piąć się w górę po liście CPU Value.

Podsumowanie. Najlepsza strategia wyboru.

  • Nie kupuj nowego. Używany sprzęt ma większa wartość, gdy chodzi o stosunek mocy obliczeniowej do ceny.

  • Lepiej kupić komputer typu desktop zamiast laptop.

  • Raspberry Pi i podobne nie bardzo nadają się do poważnych obliczeń. Zbyt duży koszt w stosunku do mocy obliczeniowej.

W oparciu o powyższe zasady:

  • Najpierw poszukaj taniego komputera na allegro.pl, czy olx.pl (względna rzecz, subiektywna, zależy od możliwości kieszeni).

  • Następnie znajdź, jaki ma procesor oraz na podstawie cpubenchmark.net jaki jest parametr CPU Mark. Poniżej 5000 raczej schodzić sensu nie ma. Mierzyłbym raczej powyżej 10000.

Komentarze mile widziane.

Zbigniew Kozioł, softquake at gmail.com