cuda入門 numba加速和pycuda加速

2021-10-02 05:05:09 字數 4619 閱讀 1138

本專案旨在研究gpu混合計算框架對spark分布式計算進行加速,以下為研究測試**

**目錄結構:

-|-batch //numba方式的批處理**

|-cuda //pycuda方式的批處理**

|-data //測試資料

select ul_data as jiakuan_dns_001,dl_data as jiakuan_dns_002,

(case when dnsreq_num > 0 then 1 else 0 end ) as jiakuan_dns_003,

(case when dnsreq_num > 0 and isnull(rcode)=false and rcode<>』』 then 1 else 0 end) as jiakuan_dns_004,

(case when response_time>0 and rcode=0 then 1 else 0 end) as jiakuan_dns_005,

(case when response_time>0 then response_time else 0 end) as jiakuan_dns_006,

(case when response_time>0 and rcode=0 then response_time else 0 end) as jiakuan_dns_007 ,

(select sum(1) from xdrdata ) as sumval from xdrdata

gpu程式設計一般步驟:

在cuda中,host和device是兩個重要的概念,我們用host指代cpu及其記憶體,而用device指代gpu及其記憶體。cuda程式中既包含host程式,又包含device程式,它們分別在cpu和gpu上執行。同時,host與device之間可以進行通訊,這樣它們之間可以進行資料拷貝。

1.分配host記憶體,並進行資料初始化;

2.分配device記憶體,並從host將資料拷貝到device上;

3.呼叫cuda的核函式在device上完成指定的運算;

4.將device上的運算結果拷貝到host上;

5.釋放device和host上分配的記憶體。

kernel在device上執行時實際上是啟動很多執行緒,乙個kernel所啟動的所有執行緒稱為乙個網格(grid),同乙個網格上的執行緒共享相同的全域性記憶體空間,grid是執行緒結構的第一層次,而網格又可以分為很多執行緒塊(block),乙個執行緒塊裡面包含很多執行緒,這是第二個層次。執行緒兩層組織結構如下圖所示,grid和block可以靈活地定義為1-dim,2-dim以及3-dim結構

由於sm的基本執行單元是包含32個執行緒的執行緒束,所以block大小一般要設定為32的倍數。

def gpu_work3(xs):

#print(type(xs))

inp = np.asarray(list(xs),dtype=np.int64)

#print("inp: ",len(inp))

inp=cuda.to_device(inp)

out = np.zeros((len(inp),7),dtype=np.int64)

out=cuda.to_device(out)

block_size = 32*4*2

grid_size = (len(inp)+block_size-1)//block_size

#print("grid block: ",grid_size,block_size)

foo3[grid_size,block_size](inp,out)

outc=out.copy_to_host()

return outc

@cuda.jit

def foo3(inp,out):

i= cuda.grid(1)

#cuda.syncthreads()

if i < len(out):

out[i][0]=inp[i][5]

out[i][1]=inp[i][0]

out[i][2] = 1 if(inp[i][1] > 0) else 0

out[i][3]=1 if(inp[i][1]>0 and inp[i][3] is not none) else 0

out[i][4]=1 if(inp[i][4]>0 and inp[i][3] == 0) else 0

out[i][5] = inp[i][4] if(inp[i][4]>0) else 0

out[i][6] = inp[i][4] if(inp[i][4]>0 and inp[i][3]==0) else 0

#out[i][7] = len(out)

#out[i][7] = sumd

#cuda.syncthreads()

map形式:

def gpufunc(xdr_data):

a=time.time()

xdr_data = iter(xdr_data)

inp = np.asarray(list(xdr_data),dtype=np.float32)

n = len(inp)

# print("len:",n)

out = np.zeros((len(inp),7),dtype=np.float32)

# out = np.empty(n, gpuarray.vec.float1)

n = np.int32(n)

#print(inp,out)

# gpu run

ntheads = 256*4

nblocks = int( ( n + ntheads - 1 ) / ntheads )

drv.init()

dev = drv.device(0)

contx = dev.make_context()

mod = sourcemodule("""

__global__ void func(float *out, float *inp, size_t n)

out[i*7+0] = inp[i*6+5];

out[i*7+1]=inp[i*6+0];

if(inp[i*6+1] > 0)

out[i*7+2] = 1;

else

out[i*7+2] = 0;

if(inp[i*6+1]>0 and inp[i*6+3]!=null)

out[i*7+3] = 1;

else

out[i*7+3] = 0;

if(inp[i*6+4]>0 and inp[i*6+3] == 0)

out[i*7+4] = 1;

else

out[i*7+4] = 0;

if(inp[i*6+4]>0)

out[i*7+5] = inp[i*6+4];

else

out[i*7+5] = 0;

if(inp[i*6+4]>0 and inp[i*6+3]==0)

out[i*7+6] = inp[i*6+4];

else

out[i*7+6] = 0;

}""")

func = mod.get_function("func")

start = timer()

func(

drv.out(out), drv.in(inp), n,

block=( ntheads, 1, 1 ), grid=( nblocks, 1 ) )

out1 = [np.asarray(x) for x in out]

print("len",len(out1))

contx.pop()

del contx

del inp

del out

run_time = timer() - start

print("gpu run time %f seconds " % run_time)

return iter(out1)

collect形式,核函式同上

inp = np.asarray(xdr_data.collect(),dtype=np.float32)

n = len(inp)

# print("len:",n)

out = np.zeros((len(inp),7),dtype=np.float32)

# out = np.empty(n, gpuarray.vec.float1)

n = np.int32(n)

#print(inp,out)

# gpu run

ntheads = 256*4

nblocks = int( ( n + ntheads - 1 ) / ntheads )

func(

drv.out(out), drv.in(inp), n,

block=( ntheads, 1, 1 ), grid=( nblocks, 1 ) )

參考部落格

線段樹入門 P2068 統計和

題目描述 給定乙個長度為n n 100000 初始值都為0的序列,x x 10000 次的修改某些位置上的數字,每次加上乙個數,然後提出y y 10000 個問題,求每段區間的和。時間限制1秒。輸入輸出格式 輸入格式 第一行1個數,表示序列的長度n 第二行1個數,表示操作的次數w 後面依次是w行,分...

python入門 P37類和物件 物件導向程式設計

class相當於房子圖紙,每個物件是參照圖紙建立的實際的房子,self相當於每一棟房子的門牌號,在下面這段 裡,每個物件都是呼叫了自己那棟房子裡的方法,就是因為self tips 在方法裡,self必須是第乙個 class build def setname self,name self.name ...

python入門 P39類和物件 拾遺

組合就是把舊類例項化放到新類裡面進行呼叫,如下 class chairs def init self,x self.num x class glasses def init self,y self.num y class build def init self,x,y self.chairs cha...