Add primops for copying/cloning an array in the new codegen
Daniel Peebles's benchmarks show that copying arrays using a indexArray#
/writeArray#
loop is much slower than using a (new) primop that calls memcpy
. In addition, cloning arrays is slower than it need to be due to newArray#
filling the array with a default element, just to have all the elements be overwritten by the contents of the array being cloned.
I suggest we add the following primops:
copyArray# :: Array# a -> Int# -> MutableArray# s a -> Int# -> Int# -> State# s -> State# s
copyMutableArray# :: MutableArray# a -> Int# -> MutableArray# s a -> Int# -> Int# -> State# s -> State# s
cloneArray# :: Array# a -> Int# -> Int# -> State# s -> (# State# s, Array# a #)
cloneMutableArray# :: MutableArray# s a -> Int# -> Int# -> State# s -> (# State# s, MutableArray# s a #)
freezeArray# :: MutableArray# s a -> Int# -> Int# -> State# s -> (# State# s, Array# a #)
thawArray# :: Array# a -> Int# -> Int# -> State# s -> (# State# s, MutableArray# s a #)
Note that ByteArray#
versions can be created using FFI calls to memcpy
and thus don't need to be primops.
Trac metadata
Trac field | Value |
---|---|
Version | 7.0.1 |
Type | FeatureRequest |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Runtime System |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | johan.tibell@gmail.com, pumpkingod@gmail.com |
Operating system | |
Architecture |