2016-06-24 21 views
1

Ich habe eine Bit-Slice-Implementierung der PRIMATE-Chiffre hier gefunden: http://primates.ae/ (Ich machte es von der 120-Bit-Version).Berechnung Zyklen/Byte von QueryPerformanceCounter()

ich es allein in C hergestellt und verwendet Intel Intrinsics, so dass ich die AVX2 Befehlssatz nutzen könnten.

Da ich ein bisschen geschnitten Umsetzung gemacht, ich wollte es für die Geschwindigkeit optimieren und damit die Leistung messen, berechnen ich die Zyklen pro Byte. Dazu verwende ich die Queryperformancecounter() Funktion zur Verfügung gestellt von Windows-

Die Sache ist jetzt. In meinen Berechnungen komme ich dazu, 1,91 Zyklen pro Byte zu verwenden, was reeeaaally gut erscheint. Ich habe das Gefühl, ich muss etwas falsch machen (ich bin nicht so gut von einem Programmierer). Dies ist, wie ich es tun:

//Size of testdata 
int testDataSize = 4000; //bytes 

//Get CPU frequency (cycles per sec) 
LARGE_INTEGER start, finish; 
double cpu_frequency; 
QueryPerformanceFrequency(&start); 
cpu_frequency = (double)(start.QuadPart) 

QueryPerformanceCounter(&start); 
encrypt(data); 
decrypt(data); 
QueryPerformanceCounter(&finish); 

double cyclesUsed = (double)(finish.QuadPart - start.QuadPart); 
double bytesSecond = (cpu_frequency/cyclesUsed) * testDataSize; 
double bytesCycle = bytesSecond/cpu_frequency; 
double cycles_per_byte = 1/bytesCycle; 

Während der Laufzeit werden die zwischen den beiden verbracht Zyklen Queryperformancecounter-Anrufe (dh die Zeit, Verschlüsseln und Entschlüsseln) ist das Delta zwischen Start und beenden, die etwa 7674 Zyklen . Dies ist die Zeit für 4000 Bytes.

Natürlich würde ich dann nur etwa 1,9 Zyklen pro Byte verwenden, aber das scheint wirklich gut ... Habe ich die Zyklen/Byte-Berechnungen korrekt implementiert und habe ich die Verwendung von QueryPerformanceCounter() richtig verstanden? Oder ich berechne gerade eine Zufallszahl.

Auch falls jemand weiß: Ist das ein realistischer Wert im Allgemeinen zum Verschlüsseln/Entschlüsseln von Daten mit modernen Chiffren? Ich weiß, dass das subjektiv ist und schwer zu beantworten ist, aber einen Versuch wert ... Ob ich es richtig umgesetzt habe, interessiert mich in beiden Fällen am meisten, da ich meine Testvektoren sehen kann mit diesen Ergebnissen.

Ich mache die Tests mit Intel TurboBoost ausgeschaltet, und mit nur 1 CPU-Kern .... Ich kann Hyperthreading nicht ausschalten (danke Lenovo BIOS vereinfacht), aber ich bezweifle, dass es einen Unterschied machen würde, da mein Code ist eingängig

+1

Vielleicht möchten RDTSC – Dani

+0

Dank verwenden. Ich habe gerade eine hart erlernte Lektion gelernt, indem ich das nicht mache, und werde es von jetzt an tun. __rdtsc scheint nützlich zu sein, wird es einen Scheck geben! – oPolo

Antwort

3

Ihr Code ist richtig, aber die Daten sind falsch interpretiert. QueryPerformanceFrequency() gibt Ihnen nicht die CPU-Frequenz, es gibt Ihnen die Leistungszähler Frequenz. Das heißt, Sie zählen als beliebige Ticks und nicht als Zyklen. Es gibt keine einfache Möglichkeit, die Anzahl der Zyklen mit Windows-Leistungsindikatoren zu ermitteln (die CPU-Frequenz ist oft dynamisch), aber Sie können eine angemessene Ausführungszeit erhalten.

+0

Vielen Dank für die Antwort, ich habe festgestellt, dass hier etwas los war. Freut mich, es geklärt zu haben. QueryPerformanceFrequency in meinem Fall gibt 2533192.00 zurück. Wenn meine CPU 2.533Ghz ist (Turbo-Boost ausgeschaltet, also ist es bei diesem Wert stabil), würde das bedeuten, dass meine Berechnungen einen Faktor von 1000 ausmachen? – oPolo

+1

@oPolo Ja, wahrscheinlich. Leistungsindikatoren sind nur zur Zeitmessung gut, daher sollten Sie den Durchsatz (MB/s) berechnen. Ich entferne den "normalerweise 100MHz" -Teil, es scheint, dass ich mit etwas anderem verwechsle. – ElderBug

+0

Die tatsächliche Perf-Zähler-Hardware kann und misst Kerntaktzyklen, nicht TSC-Zyklen. Verstehen Sie das nicht mit der Benennung einiger Windows-Funktionen. IDK, wie Sie es unter Windows machen würden, aber unter Linux können Sie 'perf stat./A.out' ausführen und sehen, wie viele Kerntaktzyklen Ihr gesamtes Programm dauerte. –