Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20100628091555.GA4747@openwall.com>
Date: Mon, 28 Jun 2010 13:15:55 +0400
From: Solar Designer <solar@...nwall.com>
To: john-users@...ts.openwall.com
Subject: faster DES on Atom

Hi,

I think Dango-Chu should have posted this a year ago, but since he did
not, I figured that I should do it myself and better late than never -
just to keep the "JtR knowledge" in one place.

It turned out that for Atom CPUs it is beneficial to change JtR's
bitslice DES SSE2 assembly code to use plain SSE instructions (not
SSE2), because those are one byte shorter, which helps the decoder
and/or caching.  I had expected this to turn out to be the case on some
CPU, but when working on this code in 2006 I only encountered CPUs that
executed both SSE and SSE2 versions of the code at the same speed (AMD
CPUs) and those that executed the SSE2 code much faster (Intel CPUs),
which is why the decision to go with SSE2 only was made.

The switch to plain SSE is trivial to make - just replace all
occurrences of five SSE2 instructions with their SSE equivalents in
x86-sse.S and/or x86-64.S.  This can be done with the following command
(uses recent GNU sed):

sed -i 's/movdqa/movaps/; s/pandn/andnps/; s/pand/andps/; s/por/orps/; s/pxor/xorps/' x86-sse.S x86-64.S

According to Dango-Chu's benchmarks, this provides a 10% speedup for
32-bit builds, but only a 0.5% speedup for 64-bit builds - both on an
Atom, indeed.  The numbers could be different on other Atom CPUs, and
indeed they're very different on non-Atom CPUs - e.g., there's a 2x
slowdown from the same change on a Core i7 (just tried).

With JtR 1.7.6+, you may additionally need to edit this check in x86-64.h:

#if defined(__SSE2__) && \
    ((__GNUC__ == 4 && __GNUC_MINOR__ >= 4) || __GNUC__ > 4)
#define DES_BS_ASM			0
[...]

The purpose of this check is to disable the assembly code in favor of
gcc-generated SSE2 code when gcc 4.4.0 or newer is being used.  To force
the use of plain SSE instead of SSE2, yet compile with gcc 4.4+, you'll
need to override this check.  This might not result in any improvement,
though, not even on an Atom, because the speedup from plain SSE for a
64-bit build, as measured by Dango-Chu, was negligible (see above).

The original blog post by Dango-Chu, in Japanese:

http://dango.chu.jp/tripper/20090429.html#p01

The same change might also be beneficial on some other CPUs - anyone
with a Pentium M?

Alexander

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.