Существует ли оболочка memmove/memcpy для STUArray?

Я переключаю программу с использования MVector Word32 на STUArray Word Word32. В моем векторном коде я использовал unsafeMove для перемещения векторных фрагментов; думая, что это, вероятно, упаковка memmove для эффективности.

case dst ⊕ 3 of
  src | n < src + w -> do
    let w0 = n - src
    let w' = w - w0
    unsafeMove (slice dst w0 v) (slice src w0 v)
    if w' <= 3
      then do
        unsafeMove (slice (n - 3) w' v) (slice 0 w' v)
      else do
        let w'' = w' - 3
        unsafeMove (slice (n - 3) 3 v) (slice 0 3 v)
        unsafeMove (slice 0 w'' v) (slice 3 w'' v)
  src | n < dst + w -> do
    let w1 = n - dst
    let w'' = w - w1
    unsafeMove (slice dst w1 v) (slice src w1 v)
    unsafeMove (slice 0 w'' v) (slice 3 w'' v)
  src -> do
    unsafeMove (slice dst w v) (slice src w v)

Класс типов MArray, похоже, не предоставляет способ перемещения нескольких элементов за один вызов, а только один за другим. Есть ли оболочка для одновременного перемещения нескольких элементов STUArray (или, может быть, ByteArray#)?

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
1
0
81
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

думая, что это, вероятно, обертка memmove для эффективности

Сначала я решил проверить для вас, так ли это на самом деле, и так ли это.

  • unsafeMove в конечном итоге сводится к операции basicUnsafeCopy, определенной для MVector, которая делегирует copyMutableArray.
  • Реализация copyMutableArray зависит от версии GHC. В старых версиях это был просто цикл ввода-вывода в обычном Haskell, но с версии 7.8 он был делегирован primop copyMutableArray#.
  • copyMutableArray# — это оболочка вокруг memmove и memcopy, в зависимости от того, перекрываются ли массивы.

Я перерыл источник Data.Array и не нашел ссылок на copyMutableArray. Другая возможность заключается в том, что Data.Array предоставляет вам некоторый способ просмотра вашего STUArray как MutableArray и, таким образом, вызова copyMutableArray себя. Но я также не нашел упоминания о MutableArray в Data.Array.

Мой предварительный вывод заключается в том, что в Data.Array нет обертки memmove/memcopy.

Нет ничего необычного в том, чтобы копаться в Data.Array.Base или даже GHC.Arr, чтобы получить доступ, необходимый для выполнения достаточно эффективных операций с массивами. Если вам действительно не нужна гибкая индексация, используйте вместо этого массивы в primitive или, возможно, vector.

dfeuer 26.12.2020 07:39

@dfeuer ага, я как-то пропустил Data.Vector.Unboxed

rampion 27.12.2020 16:27

@rampion, vector очень большой. Я (пока) не нашел там модулей, которые позволили бы вам отказаться от потенциально дорогостоящего оборудования для нарезки, когда оно вам не нужно. И механизм слияния в смешанном режиме настолько сложен, что почти никто не может понять, что происходит под капотом или что им нужно сделать, чтобы убедиться, что их код скомпилирован так, как задумано.

dfeuer 27.12.2020 18:19

Другие вопросы по теме