买专利卖专利找龙图腾,真高效! 查专利查商标用IPTOP,全免费!专利年费监控用IP管家,真方便!
申请/专利权人:湖北九同方微电子有限公司
摘要:本发明公开了提供了一种基于状态轮询的非阻塞式多线程矩阵乘法处理方法,因为线程执行速度和效率不一致,线程不用顺序阻塞等待当前线程的下一个线程负责打包的子矩阵,而是通过轮询遍历的方式,非阻塞式访问线程,只要该线程负责打包的子矩阵已经准备完毕,就可以指向对应的计算操作。本发明通过当前线程顺序遍历其他线程,完成非阻塞式线程同步和计算,解决原有方案由于线程等待而浪费计算资源,解决计算资源利用率不高的问题。
主权项:1.一种基于状态轮询的非阻塞式多线程矩阵乘法处理方法,其特征在于,所述方法包括以下步骤:S1、初始化:设矩阵A的维度为m*k,矩阵B的维度为k*n,设置矩阵A和矩阵B的待分块大小,即分块后将得到nthreads_m个子A矩阵和nthreads个子B矩阵;初始化用于矩阵计算的二维线程,二维线程的行维度为nthreads_m,列维度为nthreads_n,即二维线程的总线程数nthreads=nthreads_m*nthreads_n;当mnthreads_m*4,执行nthreads_m减半运算,直到m≥nthreads_m*4;设置计数器cnt不等于nthreads_n;建立用于定义每个线程在二维线程中的位置的二维索引[mypos_m,mypos_n]并为每个线程分配线程ID,其中,mypos_m为行索引,mypos_n为列索引,线程值mypos=mypos_m*nthreas_m*mypos_n;每个线程根据自己的线程ID负责矩阵A和矩阵B的分块和打包,分块和打包过程中用于存放拷贝打包矩阵A和矩阵B的空间分别为第一空间packedA和第二空间packedB,其中第二空间packedB划分为2个以上第二子空间packed_subB;创建大小为nthreads的任务列表jobs和矩阵信息列表queues;其中任务列表jobs采用数组数据结构类型,其中每个数据元素用于记录当前线程与其他线程分块数据保存的地址;矩阵信息列表queues采用列表数据结构,其中每个数据元素用于记录当前线程所负责的矩阵分块的起始位置、大小、数据搬运地址和关联的下一个矩阵信息;S2、设置打包序数j,当0=j且jtimes,判定当前线程current在第二空间packedB没有其他线程在用,并且第二空间packedB中第j个第二子空间packed_subB[j]非空,则打包第j个第二子空间,其中times为预设的执行打包第二子空间的总次数;待当前线程负责的第一空间packedA和第j个第二子空间packed_subB[j]就绪,开始执行计算kernel操作,所述的计算kernel为打包完毕的第一空间packedA和第二空间packedB中的矩阵数据利用CPU完成自矩阵乘法运算的最小函数体;S3、判断当前线程负责的打包第二空间packedB操作是否完成,如果没有则返回步骤S2,否则进入步骤S4;S4、对当前线程与其他线程告知变量job[current].working[other_thread_id]赋值packedB地址,告知其他线程可以访问本线程打包的第二空间packedB,其中当前线程与其他线程告知变量job[current].working[other_thread_id]是任务列表jobs中的元素,采用线程同步数据结构,任务列表jobs中每个数据元素记录当前线程current与相同列维度nthreads_n的其他线程other_thread_id完成分块数据的地址;S5、对已经就绪的第一空间packedA和第二空间packedB中的矩阵数据执行计算kernel操作;S6、通过任务列表jobs,判断与线程维度nthread_n相同的下一个线程的负责的第二空间packedB是否有效,如果有效,进入步骤S7处理;否则对当前变量current执行递增操作来遍历其他线程分块矩阵数据打包状态,即判定其他线程负责的打包B矩阵数据是否对自己可用,重复本步骤直至有第二空间packedB就绪可用;S7、对自己负责打包且已经就绪的第一空间packedA,和其它线程负责打包就绪数据第二空间packedB,执行计算kernel;S8、判断cnt与thread_m是否相等,如果是则处理结束,否则对cnt做累加操作并返回步骤S6。
全文数据:
权利要求:
百度查询: 湖北九同方微电子有限公司 一种基于状态轮询的非阻塞式多线程矩阵乘法处理方法
免责声明
1、本报告根据公开、合法渠道获得相关数据和信息,力求客观、公正,但并不保证数据的最终完整性和准确性。
2、报告中的分析和结论仅反映本公司于发布本报告当日的职业理解,仅供参考使用,不能作为本公司承担任何法律责任的依据或者凭证。