[Haskell-cafe] Annoyed at System.Random

Vincent Hanquez tab at snarc.org
Fri May 4 16:11:24 CEST 2012

On 05/04/2012 02:37 PM, Ryan Newton wrote:
>     My end goal is to have the user use transparently the fastest
>     implementation available to their architecture/cpu providing they use the
>     high level module. I've uploaded the cpu package which allows me to detect
>     at runtime the aes instruction (and the architecture), but i've been
>     distracted in implementing fast galois field arithmetics for GCM and XTS
>     mode (with AES).
> Yes!  A worthy goal!
> I think the proposal here is that we do the build/integration work to get 
> something good which is portable enough and install-reliable enough to replace 
> 'random'.  Then people who don't care will be using a good implementation by 
> default.
> That was my goal when I had my own small shot at this, but what I came up with 
> was *very* build-fragile.  (Depended on assembler being available, or on 
> prebuilt binaries being included for that package.)  You can see the Setup.hs 
> customization I attempted to do in intel-aes to compensate, but it's not enough.
> Can we write a cabal-compatible, really robust installer that will test the 
> users system and always fall back rather than failing?
That was my original plan, until i find out that it's not really possible.

For the language, i think assembly is a no-no with cabal, as such it need to be 
embedded in gcc inline assembly if you want to have something that works (unless 
there's a secret way to run assembler in a portable fashion in cabal).

Which is the reason behind why i settled on intrinsics, as i didn't have to do 
the assembly directly. It appears more portable as well
as every major compiler seems to support it (with difference of course, it would 
too simple otherwise (!))

> P.S. How are you doing the CPUID test for NI instructions?  I used the *intel 
> provided* test for this (in intel-aes) but I still had reports of incorrect 
> identification on certain AMD CPUs...

I haven't done it yet, but it should be just a matter of this piece of code for 
Intel and AMD:

import System.Cpuid
import Data.Bits

supportAESNI :: IO Bool
supportAESNI = cpuid 1 >>= \(_,_,ecx,_) -> ecx `testBit` 25


More information about the Haskell-Cafe mailing list