Die Leistung der Rasberry Pi 3 im Vergleich zu Intel Core i7 Prozessor (Fließkomma-Operationen)
Ich habe einen einfachen Vergleich konzentriert sich auf floating point operations mit C#, für die gezielte Raspberry Pi 3 Model 2 mit Windows 10 IoT und ich haben es im Vergleich zu Intel Core i7-6500U CPU @ 2.50 GHz.
Raspberry Pi 3 Model B V1.2 - Test-Ergebnisse - Diagramm
Intel Core i7-6500U CPU @ 2.50 GHz - x64 Test-Ergebnisse - Diagramm
Intel Core i7 nur zwölf mal schneller (x64) als Raspberry Pi 3! - nach den tests.
Den Faktor 11.67 um genau zu sein und wurde berechnet für die beste Leistung in diesen tests auf jeder Plattform. Beide Plattformen erzielt die beste Leistung für vier threads parallel ausgeführt werden, wodurch Berechnungen (sehr einfache, unabhängige Berechnungen).
Frage: was ist die richtige Methode zu Messen und zu vergleichen Rechenleistung solchen Plattformen? Die Absicht ist ein Vergleich der Rechenleistung im Bereich der Optimierung, algorithmen, machine learning-algorithmen, statistische Auswertung, usw. Daher war mein Fokus auf floating-point-Operationen.
Gibt es einige benchmarks (wie MWIPS) und Maßnahmen wie MIPS oder FLOPS. Aber ich habe nicht gefunden, eine Möglichkeit zum Vergleich der unterschiedlichen CPU-Plattformen in Bezug auf die Rechenleistung.
Fand ich einen Vergleich von Roy Longbottom ' s (Google "Roy Longbottom' s Himbeer-Pi, Pi 2 und Pi 3-Benchmarks" - kann ich nicht posten Sie weitere links hier), aber gemäß seiner benchmark, Raspberry Pi-3 ist nur vier mal schneller als der Intel Core i7 Prozessor (x64-Architektur, MFLOPS-Vergleich). So ganz anders als meine Ergebnisse.
Hier sind die details der tests, die ich durchgeführt:
Wurde der test bauen um einfache operation ausgeführt werden soll iterativ:
private static float SingleAverageCalc(float seed, long nTimes)
{
float x1 = seed, x2 = 0;
long n = 0;
for (; n < nTimes; ++n)
{
x2 = x2 + x1 * n;
}
return x2 / n;
}
wo Samen ist zufällig generiert, die in der aufrufenden Funktion und nTimes ist die Anzahl der Iterationen. Die Absicht ist zu vermeiden, einfach Compilezeit-Optimierungen.
Diese test-Funktion aufgerufen wurde mehrmals mit verschiedenen iteration Nummer (1M, 10M, 100M und 1B) im single-thread und für mehrere threads. Multithread-test Aussehen wie unten:
private static async void RunTestMT(string name, long n, int tn, Func<float, long, float> f)
{
float seed = (float)new Random().NextDouble();
DateTime s1 = DateTime.Now;
List<IAsyncAction> threads = new List<IAsyncAction>();
for (int i = 0; i < tn; i++)
{
threads.Add( ThreadPool.RunAsync((operation) => { f(seed, n/tn); }, WorkItemPriority.High));
}
for (int i = 0; i < tn; i++)
{
threads[i].AsTask().Wait();
}
TimeSpan dt = DateTime.Now - s1;
Debug.WriteLine(String.Format("{0} ({1:N0}; {3}T): {2:mm\\:ss\\.fff}", name, n, dt, tn));
}
Test wurden ausgeführt in Debug - Modus. Anwendung gebaut wurde, als UWP (Universal-Windows-Plattform). ARM-Architektur für Raspberry Pi und x86 für Intel.
- Auch wenn Ihre benchmark erzählte (es ist nicht), warum sollte man bedenkt, eine Größenordnung, die Verarbeitung macht den Unterschied unbedeutend ist?
- Warum redest du "Core i7", wie es eine single-Mikroarchitektur? Es gibt einen signifikanten Unterschied zwischen Nehalem (erste i7) und Skylake (dein i7). z.B. finden Sie unter Deoptimizing ein Programm für die pipeline in Intel Sandybridge-CPUs Familie wo ich auch erklärt.
- Vielen Dank für die Kommentare, Leute. Das war meine Frage - wenn es eine anständige und doch einfache Weise Vergleiche zwischen verschiedenen CPU-Plattformen für performance in der genannten Hinsicht. Einfach genug, so dass sehr unterschiedliche Plattformen sein könnte, zumindest im Vergleich zu der Größe in einigen optimale, lang laufende Szenario. Einfachheit war der Schlüssel in dieser Frage. Sorry, wenn ich nicht Staat, klar.
- Ich denke, du meintest "langsamer" in", sondern gemäß seiner benchmark, Raspberry Pi-3 ist nur bis zu vier mal schneller als der Intel Core i7"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist nur aufgefallen, dieser Letzte Teil. /facepalm. Wenn C# - debug-Modus ist so etwas wie der debug-Modus in Compiler wie MSVC, gcc und clang, dann das ist nutzlos und eine Verschwendung von jedermanns Zeit.
Das Geschwindigkeitsverhältnis zwischen debug und optimierten code ist nicht konstant über verschiedene microarchitectures. Es variiert mit vielen Faktoren, einschließlich der spezifischen code getestet. Wenn überhaupt, die extra speichert/lädt, wird die Einführung von extra-Latenz und zu bestrafen Skylake mehr als ARM, da Skylake ist in der Lage eine höhere Anweisungen-pro-Uhr-Latenz-Engpässe wie die, die nicht verlangsamt Sie unten.
Die Antwort auf Ihre Frage, wenn Sie versuchen, im Release-Modus, und finden Sie ähnliche Ergebnisse:
Wenn Sie nicht verwenden, jede Art von fast-math-option zu lassen, C# reorder-FP-Operationen
x2 = x2 + x1 * n;
Engpässe hauptsächlich auf die Latenz (von der FP-add), nicht auf Durchsatz.FP Mathematik ist nicht assoziativ, also Neuanordnen es zu
x2 += (x1 * n + x1 * (n+1)) + (x1 * (n+2) + x1 * (n+3))
würde das Ergebnis verändern. Diese Art der Optimierung ist der Schlüssel, und die loop-carried Abhängigkeit Kette (eine FP-add) kürzer ist als der Durchsatz der unabhängigen Abhängigkeits-Ketten.Wenn C# hat eine schnell-math option, die es erlaubt, den compiler zu optimieren, als wenn die FP Mathe waren assoziative, ein intelligenter compiler würde nur wieder die ganze Schleife in
x2 = x1 * (nTimes * (nTimes+1) /2)
.Ein weniger schlauer compiler könnte nur SIMD-Vektorisieren Sie mit einer Reihe von Parallelität auf befehlsebene, die es erlauben würde Skylake die zur Erreichung der peak-Durchsatz von zwei FMAs von 256b Vektoren pro Takt. (Das ist 8 Schwimmern oder 4 Doppel-pro-Vektor-und fused multiply-add ist
a = a + b*c
.)Auf Skylake, FMA hat eine Latenz von 4 Zyklen, so dass Sie (oder der compiler) benötigt 8 Vektoren von Akkumulatoren zu sättigen die FMA Ausführung Einheiten. (Auf Haswell und Broadwell, FMA-Latenz = 5 Zyklen, so müssen Sie 10-Vektor Akkus halten 10 * 8 single-precision-FMAs im Flug, max Durchsatz.)
Finden Sie in der x86 - Tags, wiki, um mehr über die x86-performance-details.
Natürlich, das wird auch helfen, die ARM-CPU in einem RPi, da ich davon ausgehe es unterstützt die ARM-SIMD-Befehlssatz. NEON hat 128-bit-Vektoren. Offenbar double-precision-Vektor-Unterstützung neu ist in AArch64, aber 32-bit-ARM-NEON-unterstützt Vektor-FP mit single-precision.
Ich weiß nicht viel über ARM.
Meine Strategie basiert auf, dass es nicht eine einzige Maßnahme dar, die repräsentativ sein. Also ich habe zahlreiche benchmarks Messen unterschiedliche Leistungsmerkmale.
In der Haupt-RPi-Dokument von mir, den Sie zitieren, Vergleiche mit Core i7 angezeigt werden, für die alten standard-benchmarks Whetstone -, Dhrystone -, Linpack-und Livermore Loops. Diese bieten 15 verschiedene Messungen, wo der i7 ist zwischen 4 und 14 mal schneller, im Vergleich mit 3.25 für die CPU-MHz. Dann gibt es eine Reihe von anderen benchmarks, nicht verglichen, in der Regel mit 60 Messungen von verschiedenen Funktionen mit Daten aus einem Cache-Speicher oder RAM.
Die Figur, die Sie Anführungszeichen (falsch herum sagen RPi 3 ist 4 mal schneller) ist von der multithreading-Bericht mit vier Kernen, wo es scheint, dass Sie sind Vergleich MFLOPS/MHz Verhältnisse von 5.025 für RPi 3 mit 23 für Core i7, mit MFLOPS gemessen von 6030 für RPi und 89700 für I7, 14.9-mal schneller. Diese sind für single-precision-Berechnungen mit NEON für RPi und SSE für Intel. Die MFLOPS/MHz-Verhältnis für Intel mit AVX-1 Hinweise wird auch zitiert, der angibt, i7 MFLOPS von 177840. Diese MP-MFLOPS test beinhaltet auch weitere Messungen mit weniger Berechnungen und cache-oder RAM-basierte Daten. Die maximalen Geschwindigkeiten zitiert werden, basieren auf der Berechnung von 32 Operationen pro Daten word in einer for-Schleife:
Für beste RPi MP MFLOPS Leistung, sollten Sie sehen, High-Performance Linpack Benchmark-Ergebnisse:
https://www.raspberrypi.org/forums/viewtopic.php?p=301458