[パラレルスプリング5] GPU

GPUパート1

レディ

  1. CUDA対応のNVIDIAグラフィックスの必要性
    |はgrep -i VGA lspciを:ビューカード情報のlinux
    を見つけるためにこれを使用することができますNVIDIAグラフィックカードを使用して:lspciの|はgrep -i NVIDIAの
    コマンドでは、「のようにすることができ03.00.0詳細を参照するには、」カードのコード: lspic -v -s 03.00.0
    参照カードの使用状況(NVIDIAの特定):NVIDIA-SMI
    定期的な出力(1秒1)の連続使用:1のnvidia-SMI -nウォッチ
  2. pycudaする必要があります(Linuxのインストール:のaptインストールのpython3-pycuda)

基本的な使用

1.基本的な操作

  1. 準備:須藤はaptインストールのpython3-pycuda
  2. CPUで使用されるメモリのマトリックスを作成します。
  3. GPUにメモリで使用されるCPUのメモリマトリックスからの移行
  4. C言語のコードエディタは、GPUコンピューティングましょう
  5. メモリからメモリに使用されるマトリックスは、CPU、GPUに移動させます

カーネルレベルスレッド
プログラムの最も重要な要素の一つは、コードを表すCUDAカーネル(カーネル)であるが、並行して実行することができ
、コア当たりの単位実行スレッドを計算する(スレッド)と呼ばれた、異なる、GPUスレッドをスレッドCPUを完了する性能に影響を与えない、より軽量コンテキストスイッチ
マシン論理形態所望の組織コアを実行しているスレッドの数を決定するためには、CUDAは、2層構造を定義します。最高レベルでは、いわゆるブロックグリッド(ブロックのグリッド)の定義は、このスレッドブロック、これらのブロックは、三次元のスレッドは、簡単に言えば(構造CUDAである二次元の格子構造を表します複数のブロックを備え、それぞれが(も)以下の各スレッドに分割動作ブロック)ブロックスレッドを複数備え

スレッドブロックは、ストリーミングマルチプロセッサ(SM)に割り当てられ、その後、スレッドが別の群に分けられるがGPUアーキテクチャのサイズを決定する縦糸と呼ばれる
並行処理SM自体を最大化するために、同じグループ内のスレッドは、さもなければ差スレッド(スレッドの発散)が存在することになる、同じ命令を実行しなければなりません

例:
各マトリックス素子X2のGPUと

import pycuda.driver as cuda
import pycuda.autoinit  # init GPU
from pycuda.compiler import SourceModule

import numpy as np

# 1.cpu create matrix
a = np.random.randn(5, 5)   # matrix:m*n
a = a.astype(np.float32)    # nvidia only support float calculate

# 2.move to gpu from cpu
a_gpu = cuda.mem_alloc(a.nbytes)    # alloc memory of gpu, this is 1 dim
cuda.memcpy_htod(a_gpu, a)      # copy cpu memory to gpu memory

# 3.gpu calculate
# create module of gpu calculate by c
mod = SourceModule('''
    __global__ void doubleMatrix(float *a)
    {
        int idx = threadIdx.x + threadIdx.y * 5;    // (x,y,z), gpu -> sm -> warp
        a[idx] *= 2;
    }
''')

func = mod.get_function('doubleMatrix') # get function from module
func(a_gpu, block = (5, 5, 1))      # set var and thread number from (x,y,z) orient to function

# 4.move to cpu from gpu
a_doubled = np.empty_like(a)        # create memory of cpu
cuda.memcpy_dtoh(a_doubled, a_gpu)  # copy gpu memory to cpu memory

print('original matrix')
print(a)
print('double matrix')
print(a_doubled)

注1インポートpycuda.autoinitのステートメントを自動的利用GPUに番号および可用性GPUに応じて選択され、これは所望の次の動作コードを作成するGPUコンテキストは(単に完全に導入されました)

:astype(numpy.float32):アイテムは多くのNvidiaカードサポートしているので、単精度モードでは変換行列でのみ単精度

注3:GPUこの(X、Y、X)に対応するパラメータブロック、スレッドモード分布、(5、5、1)に割り当てられているを設定することにより、CのGPUの機能を呼び出すときである
、threadIdx関数cであります三つのフィールドを持つ構造は、x、、 yz異なる変数の各スレッド(結合スレッドレベルを評価し)、インデックスを持つ配列に、動的に一次元アレイに割り当てられているC-GPUメモリの機能に必要によるものです使用は、threadIdx.yマトリクス変換の各列の要素の数を乗じた
詳細情報:自己発見スレッドブロックは、CUDAを分割しました

注4:C関数GPUは__global__キーワードを実行する機能がカーネル関数は、GPU上で機器のレベルを生成するためにメインスレッドから呼び出されなければならないされていることを示します
Pycudaは、メモリの4種類があるCUDA対応のGPUグラフィックスで利用可能なリソースを最大限に活用するために、メモリに関する:
寄存器(registers):各レジスタは、スレッドが割り当てられ、各スレッドが同じであっても一部の場合には、唯一独自のレジスタにアクセスすることができますスレッドブロック
共享存储器(shared memory):共有メモリ、各スレッドブロックが雌ねじ共有メモリを有し、このメモリは、高速
常数存储器(constant memory):グリッド内のすべてのスレッドは、このメモリにアクセスすることができたが、わずかにアクセス時間をお読みください。データ・メモリは、アプリケーションの期間中、一定のあった
全局存储器(global memory)、(すべてのコアを含む)すべてのグリッドのスレッドがグローバルメモリにアクセスすることができます

自己発見PyCUDAのメモリモデル:詳細については、

パッケージ制御2.python

カーネルと呼ばgpuarrayと、それが直接計算及び装置では、装置(GPU)を計算するデータに格納することができます

例:
各マトリックス素子X2のGPUと

import pycuda.autoinit
import pycuda.gpuarray as gpuarray

import numpy as np

x = np.random.randn(5, 5)
x_gpu = gpuarray.to_gpu(x)

x_doubled = (2 * x_gpu).get()

print('x:')
print(x)
print('x_doubled:')
print(x_doubled)

他の

プログラミング・インターフェースを提供し、あなたはCUDAを継続書くことができCUDA APIに基づいて、NumbaProはPythonのコンパイラであるとして、他のライブラリを簡単に、CUDAのためにプログラムすることができますがあり、計算に関連するタスクの配列を実行するように設計され、広く使用されています同様のnumpyのライブラリ
NumbaPro:GPUプログラミングライブラリは、多くの数値ライブラリを提供し、ライブラリは、GPU加速しました


1.参考図書:「Pythonの並列プログラミングマニュアル」

おすすめ

転載: www.cnblogs.com/maplesnow/p/12044372.html