Haskell HIP повышает производительность при нарезке изображений

Для X-Ray Slicing я хотел бы создать программу, которая восстанавливает срезы и выполняет обратное преобразование радона. Первым шагом является создание синограмм изображений. Но создание одной синограммы занимает очень много времени.

У меня есть 1500 изображений, каждый из которых имеет 3,5 МБ в формате PNG. Распакованный, они требуют около 10 ГБ на оперативной памяти, что хорошо для меня.

Чтобы создать одну синограмму, нужно выровнять одну и ту же строку всех изображений. Я использую HIP и Storable Векторы для этой задачи. Обработка всех изображений занимает около 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,
]

0 ответов

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