–输入:1个query和100个Doc-title
•query经分词后的term
•每个文档的title经分词后的term
–输出:
•每个文档的title和query的特征向量四个相似度
–DNN 输入层相似度
–DNN前馈输出后相似度
–CNN输入层相似度
–CNN前馈输出后相似度
通过每一步的计算量分析(也可以用Visual Profiler), 得到:
1. CNN卷积层最耗时;
2. Word-vector从Host到Device的copy耗时大;
1. CNN卷积层优化:
因为卷积核矩阵固定,word-vector词典固定,所以每个word-vector可以事先和卷积矩阵计算好,存储起来;
存储量原来:N*100; 存储量之后:N*728*3 (N是词个数,100是词向量维度,728是卷积核个数,3个window-size)
词典增大24倍,GPU放不下,只好放到host主存;
此举:QPS800==>QPS1250
2. DNN word-vector copy优化:
把词表放到GPU,CPU端维护"offset[词id]=词在显存中的offset"的数组,把offset的mini-batch发给显存,显存上直接用GPU来Max-pooling即可;
此举:QPS1250==>QPS1400
3. CPU中的CNN卷积计算优化:
AVX2, 每个指令8个float运算;
此举:QPS1400==>QPS1600
4. 余弦相似度计算优化:
优化之前:用thrust库计算q^2, t^2, q*t, 这3个向量,然后用这个矩阵乘单位向量实现加和,最后传到host上由CPU计算余弦相似度;
分析:thurst读global-memory 4次,写3次;cuBLAS读3次写3次;
优化:手写kernel, 读2次到shared-memory,计算结果折半法reduce,直接在GPU上算完余弦相似度,写回global-memory;
此举:QPS1600==>QPS1700