Zulip Chat Archive

Stream: lean4

Topic: Regarding map and extract for Byte/FloatArrays


Number Eighteen (Jul 21 2024 at 10:48):

Hi all;

I notice that ByteArray and FloatArray lack map, and FloatArray also lacks extract. Is there a performance reason for this, or just that these operations were not needed for these types?

I would like to understand how compiler optimizations are applied to these two types in order to avoid doing something bad. Say I write an extract function for FloatArray as follows (NOT compatible with the current API):

@[inline]
def FloatArray.extractAux (A C : FloatArray)
    (start size : Nat) : FloatArray :=
  match size with
  | 0 => C
  | k + 1 => FloatArray.extractAux A
        (C.push <| A.get! start) start.succ k

@[inline]
def FloatArray.extract (A : FloatArray)
    (start size : Nat) : FloatArray :=
  if start + size > A.size then
    #[]⟩
  else
    FloatArray.extractAux A
       (FloatArray.mkEmpty size) start size

Is there something bad happening here? If so, what are the tools if any to test performance pitfalls in the above code?

A similar question applies to map: would the obvious implementation of map create performance problems?

François G. Dorais (Jul 21 2024 at 12:35):

Note that ByteArray and FloatArray are scalar arrays, which are implemented differently from Array. The issue with map is that in-place optimization is not possible for ByteArray except for maps UInt8 -> UInt8. (Similarly for FloatArray.) So there is no major advantage over a plain for loop.

The reason ByteArray.extract exists is that it is a common special case of ByteArray.copySlice, which is basically Lean's wrapper around C's memcpy. There is no similar low-level function for FloatArray implemented in Lean core, so there is currently no FloatArray.copySlice nor FloatArray.extract. I think that's an omission.

I think Lean core would currently accept these only if they come with efficient low-level implementations. That said, all of these would be welcome additions to Batteries, even if implemented as for loops.

François G. Dorais (Aug 01 2024 at 16:53):

See batteries#902


Last updated: May 02 2025 at 03:31 UTC