本專案旨在研究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...