Mam 1000 unikalnych programów wraz z danymi wejściowymi.
Okej.
Każdy program:
- potrzebuje określonej ilości pamięci ram np. 500mb, 2gb
- zawiera od 1 do N zestawów danych wejściowych
- jest algorytmem referencyjnym pod kątem czasu wykonania
To znaczy?
Każdy program działa z limitem pamięci np. 500mb lub 2gb
- działa jedkowątkowo
- uruchomiony jest w kontenerze
Fuj.
Programy nie tworzą wątków.
- posiada jedną lub więcej implementacji w różnych językach programowania (np. program nr. 201 ma impelementacje w Javie i C#)
- działa na linuxie
Dla każdego z tych programów chciałbym wykonać porównanie pod kątem czasu wykonania obliczeń na zestawie danych.
Jeżeli mam nowy program który chciałbym sprawdzić to czy musi on uruchamiać się na tym samym procesorze czy jest inny sposób pomiaru wydajności? Np. liczba cykli procesora albo instrukcji itd?
Wydajności czego? CPU, programu czy algorytmu, pamięci, działania całości?
Wydajność od momentu wczytania danych wejściowych jako program konsolowy na stdin a otrzymaniu wyniku na stdout
- Czy jeżeli mam dwa różne procesory np. Intel Xeon 2.5Ghz i AMD Epyc 3.0Ghz to czy jedynym sposobem na porównanie wydajności jest wykonanie pomiaru czasu wykonania dla każdego z procesorów?
Czy porównanie komfortu jazdy Maybachem i Rolls Roycem jest możliwe tylko wykonując jazdę każdym z nich?
Jeżeli można zrobić benchmark pytanie jak porównać dwa procesory?
- Czy jeżeli mam dwa lub więcej różnych procesorów o różnym obciążeniu np. na klastrze K8S to czy pomiar wydajności jest możliwy?
Wydajności czego?
Każdego z programów. Czas obliczeń od momentu wczytania danych przez stdin a otrzymania wyniku na stdout jak w aplikacji konsolowej
- Jak w zasadzie można zmierzyć wydajność CPU względem różnych modeli i czy możliwe jest uruchamianie takich testów na różnych modelach CPU?
What are CPU benchmarks?
Czy sugerujesz wykonanie benchmarku dla każdego programu na każdym procesorze dla programu wzorcowego a następnie porównanie wyników z innymi procesorami?
- Czy jedynym sposobem skalowania takich pomiarów jest posiadanie np. 100 maszyn wirtualnych z 100% procesora i tak aby każda była taka sama?
Nie.
Jakie są pozostałe? Kilkanaście fizycznych maszyn?
@AnyKtokolwiek: wyobraź sobie że masz portal typu
https://codeforces.com/
https://www.hackerrank.com/
Portal zawiera 1000 zadań które możesz rozwiązać np. w 30 różnych językach programowania. Każde zadanie posiada swoje testy (od jednego do n) oraz rozwiązania referecyjne będące wzorce czasowym.
Użytkownicy wrzucają na portal swoje kody źródłowe (pomijamy kwestie bezpieczeństwa, zakładamy że kod jest jednowątkowy) i że nie wykonuje żadnych operacyji których mu nie wolno np. wstawek assemblera, instrukcji wektorowych i takich co znacząco zmieniają czas wykoniania.
W jaki sposób zmierzyć czas wykonania programu dla każdego z zadań?
time(1) - nie time budowany w bash
a jeszcze lepiej
perf stat
Uruchomione z najwyższymi priorytetami np przez chrt. Pomijamy tutaj kwestie czy to bezpieczne i jak to się zachowa jak ktoś zcznie testować forkbomby na tym.
W jaki sposób priorytetyzacja wypłynie na czas wykonania?
Postawienie maszyn wirtualnych nawet z 100% użycia CPU odpada, gdyż maszyna będzie miała współdzielony cache z innymi maszynami i kilka innych zasobów więc zostają maszyny fizyczne, które mają taką samą konfiguracje.
Pytanie czy da się zrobić inaczej? Liczenie instrukcji procesora też odpada, gdyż programy wykonujące preprocessing wykonają dużo obliczeń na początku a później mogą być szybsze.
Inaczej niż co konkretnie?
Inaczej niż liczenie instrukcji procesora lub czasu pomiędzy wczytaniem danych przez stdin a otrzymaniem wyniku na stdout
Rozwiązanie musi być niezależne od:
time(1)
perf stat
- architektury (x86-64, ARM, POWER)
W jakim sensie? Każda architektura to inny świat i innaczej wykonuje wiele rzeczy.
Architektura może inna ale pytanie czy jeżeli kod jest możliwy do uruchomienia na wielu architekturach to czy wydajność jest możliwa do porównania w sposób powtarzalny?