首页 > 解决方案 > Haskell HIP 提高切片图像时的性能

问题描述

对于 X 射线切片,我想创建一个程序来重建切片并执行逆氡变换。第一步是创建图像的正弦图。但是创建一个正弦图需要很长时间。

我有 1500 张图片,每张都有 3.5MB 的 PNG 格式。解压后,它们需要大约 10 GB 的内存,这对我来说很好。

为了创建一个正弦图,必须对齐所有图像的同一行。我正在使用 HIP 和可存储向量来完成这项任务。处理所有图像大约需要 1 分钟,我想知道如何加快这个过程。

我的代码在这里:

{-# LANGUAGE TypeFamilies,
  BangPatterns #-}
import System.Directory
import qualified Control.Monad as CM(mapM_, mapM)
import Graphics.Image.IO
import Graphics.Image.ColorSpace
import Graphics.Image.IO.Formats
import Graphics.Image.Interface as GII
import Graphics.Image.Interface.Vector
import Data.Vector.Storable as DVS
import Data.List as DL

type PngFormat = Image VS Y Word16

printList :: Show a => [a] -> IO()
printList list = CM.mapM_ print list

mdisplayImage :: PngFormat -> IO()
mdisplayImage = displayImageUsing eogViewer True

prepend prep app = prep DL.++ app

rowOfImage :: Int -> PngFormat -> DVS.Vector (Pixel Y Word16)
rowOfImage row image =
  slice start cols $ toVector image
  where
    rows = fst $ dims image
    cols = snd $ dims image
    start = row * cols

main :: IO()
main = do
  -- This line fetches the filenames, filtering ("..", and "." as directories)
  files <- fmap ((fmap (prepend "raw_data/")) . (DL.take numImages) . (DL.drop 2) . sort) (getDirectoryContents "raw_data/")
  images <- CM.mapM (readImageExact' PNG) files :: IO([Image VS Y Word16])
  mdisplayImage $ fromVector (numImages, (snd $ dims (DL.head images)))$ DVS.concat $ DL.map (rowOfImage 500) images
  where
    numImages = 1500

我已经使用 +RTS -s 选项对其进行了概要分析,并且垃圾收集所花费的时间很好。我怎样才能加快速度?

为了安装 HIP 堆栈,需要以下部门

resolver: lts-9.20

extra-deps: [
repa-3.4.1.4,
]

标签: imagehaskellhip

解决方案


推荐阅读