2017-10-09 2 views
1

状況
現在、私はエッジ検出を処理するプロジェクトに取り組んでいます。したがって、より良いパフォーマンスを達成するために加速アレイを使用してアルゴリズムを計算したいと思います。残念ながら、私は関数型プログラミングと並列プログラミングだけでなく、実際に何が正しいのか分かりません。
加速(Data.Array.Accelerate)を使用した並列プログラミング

通報
Iは、アレイのピクセル/値のそれぞれにアクセスする必要がエッジ検出を実行するためにグレースケールに、あるいは所定の画像を変換します。

非加速配列(Data.Arrayパッケージ)を使用して、(!)演算子を使用して目的の値を取得できました。以下のような同様の機能がある加速アレイ(Data.Array.Accelerateパッケージ)を使用して

..

(!) :: (Shape ix, Elt e) => Acc (Array ix e) -> Exp ix -> Exp e
説明:配列からスカラーを抽出する表現形式

(!!) :: (Shape ix, Elt e) => Acc (Array ix e) -> Exp Int -> Exp e
説明:線形インデックスで配列からスカラーを抽出する式形式

..しかし、彼らは常にExpデータ型または他に何から 『値をアンパック

質問
をすることが可能です..私の質問につながる式の値(Exp e)』を加速を返すに終わります私にお勧めしますか?


加速アレー作品への画像からの変換

..

toArr :: Image PixelRGB8 -> Acc (Array DIM2 (Pixel8, Pixel8, Pixel8)) 
toArr img = use $ fromFunction (Z :. width :. height) (\(Z :. x :. y) -> let (PixelRGB8 r g b) = pixelAt img x y in (r, g, b)) 
      where width = imageWidth img 
        height = imageHeight img 

..しかし、私はアクセスする必要があるので、私は、その逆にそれを行うには知りませんwidth/height/pixelsからイメージを生成する式の値。

toJuicy :: Acc (Array DIM2 (Pixel8, Pixel8, Pixel8)) -> Image PixelRGB8 
toJuicy arr = undefined 

ご協力いただければ幸いです。

答えて

1

Accelerateは、通常の並列化ではなく、具体的にはSIMD並列化であり、GPUで最も優れている点を強調しておくことが重要です。しかし、GPUメモリから任意の値を読み出すことはできません。少なくとも、パフォーマンスの利点を失うことなく、そのメモリは完全にランダムアクセス用に最適化されておらず、「バッチモード」で正しく動作するためです。したがって、実際の作業を行うライブラリの関数は常にAcc/Expの値を返します。そのため、中間結果は実際にはGPU(または他の並列プロセッサ)にとどまることがあります。

今ではも可能です。 CPUでAccelerateコードを実行します。この場合、この問題は実際には発生しません。しかし、ここでもインターフェースは一貫しています。高価な計算を最後まで実行し、最後に結果を「正常なHaskell値」に戻すだけです。

この検索を実行するために、各デバイス固有のバックエンドは、runの機能を提供します(例:Data.Array.Accelerate.LLVM.Native.run)。

関連する問題