pyCUDA教程-系列學習(1):GPU結構、pyCUDA、numbapro安裝及HelloGPU例子

GPU結構

CPU v.s. GPU



CPU是被設計用來處理複雜任務的,而GPU只能做好一件事-處理百萬級的低級任務(原來是被用來生成3D圖形中的三角形),而且GPU有上千個ALU(算術邏輯單元),而CPU通常只有8個。而且很多程序大部分時間都花在GPU擅長的簡單運算上了,所以GPU加速程序很有必要。

CUDA編程有越來越複雜的趨勢,但pyCUDA則大大簡化了這個過程,並且擁有GPU加速的享受,所以面向GPU的高級編程正逐漸成爲主流。

GPU內部圖:



CUDA處理流程圖:



可以看出,由CPU向GPU部署處理任務,同時由內存向GPU顯存複製處理數據,而後GPU的顯存將數據佈置到每個核進行搞笑的並行運算,而後將結果返回顯存,再由顯存將結果返回內存。這個流程將會在程序中反覆出現。

pyCUDA的安裝在python下很簡單,只要:(本人用的python3,例子中都改成python3了,其實變得不大)

ubuntu下,sudo pip3 install pycuda

windows命令行,pip3 install pycuda

同時分享,api和官方例子地址:

api:

https://documen.tician.de/pycuda/index.html、

例子:

https://wiki.tiker.net/PyCuda

HelloGPU例子:

import pycuda.driver as drv
import pycuda.tools
import pycuda.autoinit
import numpy
import numpy.linalg as la
from pycuda.compiler import SourceModule

mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
  const int i = threadIdx.x;
  dest[i] = a[i] * b[i];
}
""")

multiply_them = mod.get_function("multiply_them")

a = numpy.random.randn(400).astype(numpy.float32)
b = numpy.random.randn(400).astype(numpy.float32)

dest = numpy.zeros_like(a)
multiply_them(
        drv.Out(dest), drv.In(a), drv.In(b),
        block=(400,1,1))

print(dest-a*b)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章