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