BETA

CUDAnative.jlで爆速並列計算

投稿日:2018-12-23
最終更新:2018-12-23

はじめに

この記事はJuliaのパッケージCUDAnative.jlについて簡単に書いたものです。OSはWindows10(64bit), Juliaはv1.0.0, CUDAdrvはv0.8.6, CUDAnativeはv0.9.1です。

CUDAnative.jlってなに?

CUDAnative.jlはJuliaのコードをCUDAで動かすためのサポートパッケージです。簡単に言えばGPUを動かせます。

インストール

先にCUDA Toolkitをインストールする必要があります。
それをインストールしたらJuliaのRELPを立ち上げてjulia> ]add CUDAnativeをします。これでインストール完了です。これで今日からあなたもGPU使いだ!!

どうやって使うの?

GitHubにあるexamplesフォルダの中身を見てもらうのが速いのですが、それだと味気ないので一つ例を出しておきます。
ということでCUDAnative.jlを使ってジュリア集合を計算するプログラムを作りました。

using CUDAdrv, CUDAnative  

function julia_set!(z, c, count, iterate=100)  
    i = (blockIdx().x-1) * blockDim().x + threadIdx().x  
    for j in 1:iterate  
        if abs2(z[i]) > 4  
            count[i] = j  
            return  
        else  
            z[i] = z[i]^2 + c[i]  
        end  
    end  
    count[i] = iterate  
    return  
end  

lensize = (1024, 1024); pos = 0.01  
c = zeros(Complex{Float32}, lensize) .+ (-0.8 + 0.156im)  
z = [Complex{Float32}(i + j*1im) for i in range(-pos, stop=pos, length=lensize[1]),   
                                     j in range(-pos, stop=pos, length=lensize[2])]  

z_d = CuArray(Array(transpose(z)))  
c_d = CuArray(c)  
count_d = CuArray(zeros(Int32, lensize))  

@cuda threads=lensize[1] blocks=lensize[2] julia_set!(z_d, c_d, count_d, 2^20)  

count_dをPlotsで描画したもの

プログラムの鍵はi = (blockIdx().x-1) * blockDim().x + threadIdx().xで、これで各threadに計算に使う配列のindexを指定しています。また@cudaでコンパイルする関数は戻り値の無い関数でなければならないため、計算結果を得るためには破壊的な関数にする必要があります。

上のプログラムだと1024×1024マスでジュリア集合を計算していますが、私の環境だと120msしか計算にかかりません。CPUだと大体1300msほどかかりますから10倍ちょっと速いことになります。

正直、爆速...爆速なのかな?爆速ってことでいいや!

よく分からないこと

本来、CUDAはGPUの処理部をGrid, Block, Threadというもので分けるのですが(詳しい構造などはここでは割愛します)、今のところCUDAnative.jlでGridを扱う方法を見つけていません。Block, Threadはそれぞれ1024個まで作成が可能で、今回はその限界値を使っていますが、Gridはおおよそ2^32まで扱えるらしいという情報を得ましたので、是非とも使いたいところ...!
一応gridDim()というものは見つけましたが使い方がよく分からないままです。何かわかったことがあったら追記します。

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@ToTTi95Uの技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!