博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
cuda版本的word2vec
阅读量:4153 次
发布时间:2019-05-25

本文共 797 字,大约阅读时间需要 2 分钟。

上篇博客的快排中用到了基于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个线程实现对向量相乘的并行

转载地址:http://cyeti.baihongyu.com/

你可能感兴趣的文章
C与C++互相调用
查看>>
map server
查看>>
MTK Android 开发笔记
查看>>
大一大二ACM训练时,建立的一个博客,专门用来写题解的
查看>>
读书笔记(会不断更新中)
查看>>
图形学实验一:bresenham算法 画线和画圆
查看>>
codeblocks配置GLUT
查看>>
矩阵卷积、矩阵相乘的转化
查看>>
图形学实验二:画个火柴人
查看>>
openGL光照(illumination)
查看>>
C++重载,重写,重定义
查看>>
全排列生成算法之字典序
查看>>
在CodeBlocks中使用openGL
查看>>
CodeBlocks配置openGL遇到的一些问题
查看>>
图形学实验三:Texture Mapping
查看>>
安卓环境搭建及虚拟机genymotion使用
查看>>
Github学习
查看>>
可视化实验一:Echars的初步使用
查看>>
人机交互实验:Android开发之人物移动、地图滑动、传感器、触屏的应用
查看>>
在人机交互实验中遇到的一些问题
查看>>