cuda版本的word2vec
上篇博客的快排中用到了基于warp的cuda操作用于分隔數(shù)組, 為什么要將控制線程的級別定義為warp呢?
在一個(gè)warp內(nèi),線程的可以通過__ballot函數(shù),并發(fā)的獲取這32個(gè)數(shù)中于pivot的比較結(jié)果,然后通過ptx類似匯編的語句asm("mov.u32 %0, %%lanemask_lt;" : "=r"(lane_mask)) 獲得線程在warp內(nèi)的位置的掩碼,再按位與之后調(diào)用 __popc函數(shù)就可以獲得在這個(gè)warp內(nèi)這個(gè)線程之前有多少個(gè)線程對應(yīng)的數(shù)大于或者小于Pivot,就可以獲得這個(gè)線程對應(yīng)的數(shù)的偏移,進(jìn)而就實(shí)現(xiàn)了分割數(shù)組。
這里的所獲得的啟發(fā)就是,一個(gè)看似只能串行的掃描操作,也可以通過控制warp實(shí)現(xiàn)并行
到這里聯(lián)想到之前研究風(fēng)辰大神對word2vec的cuda改寫,也實(shí)現(xiàn)了對warp的精細(xì)控制,進(jìn)而獲得的極大的加速?https://github.com/fengChenHPC/word2vec_cbow
int blockSize = 256;
int gridSize = (sentence_length)/(blockSize/32);
cbow_kernel<1><<<gridSize, blockSize, smsize>>>()
一個(gè)block有8個(gè)warp,一個(gè)warp處理一個(gè)字,一個(gè)block可以處理8個(gè)字,一共有sentence_length個(gè)字,所以需要gridSize個(gè)block
一個(gè)字對應(yīng)這一個(gè)特征向量的相乘操作,例如
for (int c = idInWarp; c < layer1_size; c += warpSize) neu1[c] += syn0[c + last_word * layer1_size];
比如一個(gè)字對應(yīng)了幾百維的特征向量,這個(gè)字又對應(yīng)一個(gè)warp內(nèi)的32個(gè)線程,可以用32個(gè)線程實(shí)現(xiàn)對向量相乘的并行
總結(jié)
以上是生活随笔為你收集整理的cuda版本的word2vec的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gpu排序
- 下一篇: eclipse远程开发