From e92fd0f9b293b0a23f61df5e4d4d3e2a2627dfd6 Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Mon, 2 Apr 2018 13:40:33 -0400 Subject: [PATCH] Hoist XY and V out of parallel for loop --- scrypt.cpp | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/scrypt.cpp b/scrypt.cpp index 452ec284..34b0532f 100644 --- a/scrypt.cpp +++ b/scrypt.cpp @@ -251,34 +251,23 @@ size_t Scrypt::DeriveKey(byte*derived, size_t derivedLen, const byte*secret, siz // 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) PBKDF2_SHA256(B, B.size(), secret, secretLen, salt, saltLen, 1); - if (parallel == 1) + // http://stackoverflow.com/q/49604260/608639 + #pragma omp parallel { AlignedSecByteBlock XY(static_cast(blockSize * 256U)); AlignedSecByteBlock V(static_cast(blockSize * cost * 128U)); // 2: for i = 0 to p - 1 do - // 3: B_i <-- MF(B_i, N) - Smix(B, static_cast(blockSize), cost, V, XY); - XY.SetMark(256); V.SetMark(128); - } - else - { - // 2: for i = 0 to p - 1 do - #pragma omp parallel for + #pragma omp for for (size_t i = 0; i < static_cast(parallel); ++i) { - // Can't figure out how to hoist this out of the for-loop - // https://stackoverflow.com/q/49604260/608639 - AlignedSecByteBlock XY(static_cast(blockSize * 256U)); - AlignedSecByteBlock V(static_cast(blockSize * cost * 128U)); - // 3: B_i <-- MF(B_i, N) const ptrdiff_t offset = static_cast(blockSize*i*128); Smix(B+offset, static_cast(blockSize), cost, V, XY); - XY.SetMark(256); V.SetMark(128); } } + // 5: DK <-- PBKDF2(P, B, 1, dkLen) PBKDF2_SHA256(derived, derivedLen, secret, secretLen, B, B.size(), 1);