{Python}GPGPUで行列積を求める

GPGPUで行列積を求めて行きたいと思います。PyOpenCLについてはあまり理解していないところが多いので、正確ではないと思います。 ただ、私はこう理解していて、こうすると動きます、という、メモです……、。 numpyで求める 行列積はnumpyのdotで求めることができます。 a=行列A b=行列B product = numpy.dot(a,b) GPGPUで行列積を求める GPGPUで演算を行うには、 Context Queue Buffer Kernel を記述することが必要になります。 Context どのGPUを使用するかを指定します。 引数にinteractive=Falseで自動選択。 pyopencl.create_some_context(interactive=False) Queue Contextのなかに新しいqueueを作成します。 pyopencl.CommandQueue(context) Buffer ホスト(CPU)とデバイス(GPU)間のデータ受け渡し用のBufferを作成します。 カーネルに引数として渡す行列と、結果を受ける行列を作成 ここでは、-9~9までのランダムの整数からなる4*4の行列を作成 アウトプット行列は行列aと同じ大きさのから行列を作成 size = 4 a = numpy.random.randint(-9, 9, (size,size)).astype(numpy.int32) b = numpy.random.randint(-9, 9, (size,size)).astype(numpy.int32) dest = np.empty(a.shape, dtype=np.int32) bufferの作成 用途によって、READ_ONLY, WRITE_ONLY, READ_WRITEを指定する。 ここではインプットがREAD_ONLY,アウトプットbufferがWRITE_ONLYになっているが、 行列のすべての要素になんらかの演算をする場合など、インプットデータを加工したものを戻り値として得たい場合はREAD_WRITEにする。 hostbufを指定することでホスト->デバイスの転送が自動で行われる。 a_buf = pyopencl.Buffer(context,… Continue Reading {Python}GPGPUで行列積を求める

{Python}GPGPUの導入

このエントリは移管です。 環境等 win 10 GPU Intel HD Graphics 4600 python 2.7 GPGPUとは さまざまな演算を行うCPUに対して、PCにはGPU(graphics processing units)というグラフィック関連の処理を行うための専用ユニットがあります。 そのGPUをグラフィック処理以外の用途に使うことをGPGPU(General-purpose computing on graphics processing units)といいます。 得手不得手はありますが(I/O処理は遅い)、処理の一部をGPGPUで動かすことで演算速度を飛躍的に向上させることができます。 最近GPGPUの勉強をしたので、復習がてら自宅の普通のノートパソコンでもpythonでのGPGPU開発環境設定をしてみます。 GPGPUを実現するためには、以下の並列コンピューティングフレームワークの導入が必要です。 CUDA:NVIDAのGPUのみ OpenCL:Intel、AMD、ARD 以下フレームワークの導入から始めます。 搭載GPUの確認 まずはコンパネ>デバイスマネージャーから自分のGPUの種類を確認します。 Intel HD Graphics 4600というやつでした。 というわけでOpenCLがよさそうです。 OpenCLのインストール まずはこの中から自分のGPUにあったSDKをインストール。 NVIDIA – CUDA Toolkit AMD – AMD APP SDK(Also work with Intel’s) Intel –  Intel SDK for OpenCL Applications Intelだから、Intelがいいかと思ったけど、別で試したのがAMDのグラボで、AMDのSKDを使ったので、今度もAMDにしてみました。 OCL_SDK_Light_AMD.exeをDLしてインストールします。… Continue Reading {Python}GPGPUの導入