雑記帳

ちょっとした文章とかメモ書きとか。

HaskellでOpenCLを使ってみる その3

その2からだいぶ経ってしまいましたが、その3です。

前回よりもう少し汎用性を上げるために

  • OpenCLのカーネルだけではなく、入力値も読み込んでみる
  • 読み込んだ入力値を数値型へ変換する関数を実装する
  • 出力も工夫できたらいいね

ってな訳で作ってみます。

先ずは、入力値を読み込む関数から。

import qualified Control.Exception as E
-- read input value from File
numberFromFile :: IO String
numberFromFile = do let cltransformSource = "input.txt"
                    E.catch (readFile cltransformSource)
                          (onError cltransformSource)

これはその2と同じようにできますね。

ファイルから読み込んだ時はString型なのでそれを扱いやすい[CDouble]型にしてみましょう。

import Foreign.C.Types( CFloat,CDouble )
import Data.List
-- transform String to [CDouble]
toNum :: String -> [CDouble]
toNum = foldr toNumber [] . words
      where toNumber xs number = read xs:number

これでString->[CDouble]な関数ができますね。

ついでに[CDouble]->Stringな関数も作ってみましょう。

-- transform [CDouble] to String
toStrings :: [CDouble] -> String
toStrings = unlines . foldr toStr [] 
    where toStr xs number = show xs:number

その2では簡単な計算でした。今回は数式をただソースコードにしただけのフーリエ変換を実装してみます。

これらを使うHaskellのOpenCLを用いるプログラムは以下のようになります。

こうすると、例えば以下のファイル(input.txt)を食わせると

1.7071067812
0.9238795325
-0.0000000000
0.9238795325
0.2928932188
0.3826834324
2.4142135624
1.1480502971
-1.7071067812
-0.9238795325
0.0000000000
-0.9238795325
-0.2928932188
-0.3826834324
-2.4142135624
-1.1480502971

以下のように出力されるようになります。

% ./ft_1d
[0x0000000002767b88,0x0000000002780670]
[CL_DEVICE_TYPE_CPU]
[CL_DEVICE_TYPE_GPU]
Original array = 
1.7071067812
0.9238795325
-0.0
0.9238795325
0.2928932188
0.3826834324
2.4142135624
1.1480502971
-1.7071067812
-0.9238795325
0.0
-0.9238795325
-0.2928932188
-0.3826834324
-2.4142135624
-1.1480502971

Result array   = 
6.661338147750939e-16
8.000000000049777
7.938115703915682e-16
8.000000000122203
4.4260817179820244e-15
7.999999999991849
7.015391459123505e-15
6.042233352521482e-11
4.991636170995617e-15
6.041867178417157e-11
6.27586489761324e-15
7.9999999999918465
2.4970138487129154e-14
8.000000000122185
2.1255490196279483e-14
8.000000000049791

大体このプログラムでGTX550TiとGTX650Tiでは51200点までは上手く動きます。
Linuxでは重たい計算をさせても問題が無い。
GPGPUの実行時間の制限がなく、画面更新が止まるだけです。

GPUもっと活用したいなぁ…

追記:cabalで管理できるようにcabalファイルの追加とファイル分割をしたリポジトリをGithubに作りました→https://github.com/cosmo0920/Haskell-OpenCL

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。