最初我有一个 ByteString,然后我将其解压缩并转换为 Int16,这部分过程花费的时间相对较少。然后,我使用以下行将 Int16s 列表转换为 Repa 数组,
Repa.fromListUnboxed (Z :. bytesOfDataPerImage `div` 2) listOfInts
根据分析器的说法,这条线占用了大约 40% 的 CPU 时间,这可能只是表明我正在执行的计算不保证使用 Repa。从 ByteString 到 Repa 数组时,是否有更有效的路线?
我已经尝试了 Repa fromByteString 函数,虽然转换
Array B DIM1 Word8 -> Array U DIM1 Int16
很慢。我通过首先将数组重新整形为 Word8s 的二维数组,然后折叠到 Int16s 来执行此操作。也许字节数组是正确的方法,而我的转换方法是错误的。
convertImageData :: Array B DIM1 Word8 -> Array U DIM1 Int16
convertImageData !arr = Repa.foldS convertWords 0 (Repa.map fromIntegral (splitArray arr))
splitArray :: Array B DIM1 Word8 -> Array U DIM2 Word8
splitArray !arr = computeUnboxedS $ reshape (Z :. ((size $ extent arr) `div` 2) :. 2) arr
convertWords :: Int16 -> Int16 -> Int16
convertWords !word1 !word2 = (word1 `shiftL` 8) .|. word2
在某些情况下,该程序正在针对用 C/C++ 编写的同一程序进行基准测试。