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
Vielleicht möchten RDTSC – Dani
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