SHA256-performance-Optimierung in C
Muss ich hash auf eine große Datenbank mit Werten ziemlich oft. So eine schnelle Implementierung der SHA-2-hasher benötigt wird. Ich bin derzeit mit der SHA256.
Den sha256_transform Algorithmus, den ich verwende im Moment ist dieses:
http://bradconte.com/sha256_c
(code unten)
Ich habe profilierten mein code-snippet ist man genau 96% der Rechenzeit pro hash, so dass diese Funktion entscheidend, um meine Ziele zu erreichen.
Es arbeitet auf einer 64-byte-langen Binär-Zeichenfolge mit dem Namen data[]
aus und gibt das Ergebnis in ctx->state
.
Bitte ich um eine schnellere version dieser Funktion. Bedenken Sie, dass selbst geringfügige änderungen können Auswirkungen auf die Geschwindigkeit negativ.
#define uchar unsigned char
#define uint unsigned int
#define ROTLEFT(a,b) (((a) << (b)) | ((a) >> (32-(b))))
#define ROTRIGHT(a,b) (((a) >> (b)) | ((a) << (32-(b))))
#define CH(x,y,z) (((x) & (y)) ^ (~(x) & (z)))
#define MAJ(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
#define EP0(x) (ROTRIGHT(x,2) ^ ROTRIGHT(x,13) ^ ROTRIGHT(x,22))
#define EP1(x) (ROTRIGHT(x,6) ^ ROTRIGHT(x,11) ^ ROTRIGHT(x,25))
#define SIG0(x) (ROTRIGHT(x,7) ^ ROTRIGHT(x,18) ^ ((x) >> 3))
#define SIG1(x) (ROTRIGHT(x,17) ^ ROTRIGHT(x,19) ^ ((x) >> 10))
void sha256_transform(SHA256_CTX *ctx, uchar data[]) {
uint a,b,c,d,e,f,g,h,i,j,t1,t2,m[64];
a = ctx->state[0];
b = ctx->state[1];
c = ctx->state[2];
d = ctx->state[3];
e = ctx->state[4];
f = ctx->state[5];
g = ctx->state[6];
h = ctx->state[7];
for (i=0,j=0; i < 16; i++, j += 4)
m[i] = (data[j] << 24) | (data[j+1] << 16) | (data[j+2] << 8) | (data[j+3]);
for ( ; i < 64; i++)
m[i] = SIG1(m[i-2]) + m[i-7] + SIG0(m[i-15]) + m[i-16];
for (i = 0; i < 64; ++i) {
t1 = h + EP1(e) + CH(e,f,g) + k[i] + m[i];
t2 = EP0(a) + MAJ(a,b,c);
h = g;
g = f;
f = e;
e = d + t1;
d = c;
c = b;
b = a;
a = t1 + t2;
}
ctx->state[0] += a;
ctx->state[1] += b;
ctx->state[2] += c;
ctx->state[3] += d;
ctx->state[4] += e;
ctx->state[5] += f;
ctx->state[6] += g;
ctx->state[7] += h;
}
Es dauert 96% der Zeit nicht, weil es schlecht geschrieben ist, sondern weil es von Natur aus Komplex. Dies wurde optimiert ziemlich gut, also, wenn Sie brauchen, um zu verbringen weniger Zeit computing, suchen Sie nach Möglichkeiten zu nennen, die es weniger oft.
Gibt es etwas, was deinen aktuellen code nicht tun können, gerade jetzt, weil das ist unter Ihre CPU, um neue thermische Höhen?
+1 für den gesunden Menschenverstand. Alternativ, ich weiß multithreading ist ein muss-hier haben, aber es ist nicht der Punkt der Frage. Eigentlich ja, ich Frage deshalb, weil sowohl die Geschwindigkeit UND überhitzen des Prozessors.
InformationsquelleAutor user2464424 | 2013-08-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie zur Kasse/Profil dieses Umsetzung von SHA256.
In cgminer (eine beliebte bitcoin-mining-software), ist es insbesondere geschrieben, halten Leistung im Verstand. Es umfasst 4-Wege-SIMD-Implementierungen mit SSE2. Es folgt dem gleichen Ansatz wie die bradconte sha256_transform Algorithmus, der in der Frage genannten. Der code ist zu lang, zu reproduzieren hier.
Auch die Lizenz ist ziemlich Freizügig, so dass eine Weiterverwendung/-Verbreitung, solange die ursprünglichen Autoren sind akkreditiert.
4-way SIMD implementations using SSE2
dass man das erwähnen?Aktualisiert den Antwort-mit direktem link zu sha256_4way.c.
InformationsquelleAutor TheCodeArtist
Nun, dass der Goldmont-Mikro-Architektur wurde veröffentlicht, es enthält Intel ' s SHA-Erweiterungen. Sie können eine 5x-6x speedup in der compress-Funktion mithilfe der CPU-Anweisungen. Zum Beispiel, vorgeschlagene code für ein crypto-Bibliothek erlebt der folgenden (der test aufgetreten ist auf einer Celeron J3455, die läuft mit 1,5 GHz, aber platzt bei 2.3 GHz):
Hier ist der code für den SHA256-compress-Funktion mit Intel-SHA-Erweiterungen mit Interna. Die basiert auf Sean Gulley blog auf Die Intel® SHA Extensions, und sein Beispiel-code in mitls | hacl-star | experimental.
Den
compress
Funktion unten nur mit vollen Blöcken von 64 bytes. Sie müssen setup der erste Staat, und Sie müssen pad der Letzte block. Es sieht aus wie Sie haben, abgedeckt in deinem Beispiel-code.Finden Sie Quelle für sowohl Intel-SHA-Interna und ARMv8 SHA-Interna an Noloader GitHub | SHA-Interna. Sie sind C-source-Dateien, und stellen die compress-Funktion SHA-1, SHA-224 und SHA-256. Der intrinsische Basis-Implementierungen der Durchsatz erhöhen, etwa 3x bis 4x für SHA-1 und ca 6x bis 12x für SHA-224 und SHA-256.
InformationsquelleAutor jww
Dies ist das Intel-Referenz-Implementierung:
http://downloadmirror.intel.com/22357/eng/sha256_code_release_v2.zip
Und der code ist beschrieben in:
http://www.intel.com/content/www/us/en/intelligent-systems/intel-technology/sha-256-implementations-paper.html
Bekomme ich über 350 MB/s auf einer haswell-basierten Xeon-Mikroprozessor (E5-2650 v3). Es ist implementiert in der Montage und nutzt die Intel AES-NI.
Update:
Den aktuellen Intel-Referenz-Implementierung für SHA (jetzt Teil von ISA-L_crypto) befindet sich unter:
https://github.com/01org/isa-l_crypto/tree/master/sha256_mb
Der obige code verwendet
AVX
,AVX2
undSSE4
. Stattdessen Intel-code, der verwendetSHA256RNDS2
,SHA256MSG1
undSHA256MSG2
Anweisungen (ja, drei SHA256-spezielle Anweisungen) sind viel schneller, und kann hier gefunden werden: software.intel.com/en-us/articles/... vergessen Sie nicht__get_cpuid(7, &eax, &ebx, &ecx, &edx) && (ebx >> 29) & 1)
InformationsquelleAutor Claris
Check-out die Umsetzung von Dr. Brian Gladman - http://www.gladman.me.uk/. Seine über 15% schneller ist, dann cgminer. Ich glaube nicht, können Sie viel besser tun, ohne Verwendung von SSE
InformationsquelleAutor jj99