具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
图1为本发明实施例一提供的一种原子计数器的操作方法的流程图,本实施例可适用于GPU中的多个原子操作线程,对原子计数器进行访问的情况,该方法可以由原子计数器的操作装置来执行,该原子计数器的操作装置可以采用硬件和/或软件的形式实现,该原子计数器的操作装置可配置于电子设备中。如图1所示,该方法包括:
步骤110、获取GPU中的多个待处理的线程组,确定每个线程组对应的原子计数器。
在本实施例中,GPU中可以包括多个内核core,每个内核core上可以部署多个待处理的线程组,每个线程组中可以包括多个用于对原子计数器进行操作的线程。
在此步骤中,可选的,获取到多个线程组后,可以根据每个线程组中线程对应的访问请求,确定与各线程组对应的原子计数器。可选的,所述访问请求中可以包括对应原子计数器的标识信息。
步骤120、根据每个线程组对应的原子操作函数,确定与每个线程组匹配的加法指令。
在本实施例中,每个线程组对应的访问请求中,还可以包括各线程针对原子计数器的原子操作函数(也即与所述线程组对应的原子操作函数),在获取到所述原子操作函数之后,可以根据所述原子操作函数匹配的操作类型,转换为原子计数器操作指令。
在一个具体的实施例中,所述原子计数器操作指令可以为通过硬件形式,或软硬件结合实现的ADD指令(也即加法指令)。
步骤130、在多个线程组中依次获取一个线程组作为当前处理线程组,根据所述当前处理线程组匹配的加法指令、当前处理线程组对应原子计数器的原始数值,以及当前处理线程组中包括的多个线程,并行计算每个线程对应的结果数据。
在本实施例中,可以根据多个待处理线程组的排序结果,在多个线程组中依次获取一个线程组作为当前处理线程组,然后根据加法指令的运算类型、原子计数器的原始数值,以及当前处理线程组中各线程对应的排序结果,并行计算当前处理线程组中每个线程对应的结果数据。
在一个具体的实施例中,假设当前处理线程组中包括五个线程,当前处理线程组匹配的加法指令为数值加1指令,原子计数器的原始数值为1,则可以并行计算得到每个线程分别匹配的结果数据为:2、3、4、5、6。
在本实施例中,所述加法指令可以为硬件指令,或者软硬件结合的指令,本实施例对此并不进行限制。通过将GPU中线程组对应的硬件形式的原子操作函数,转换为加法指令,可以实现对线程组中全部线程的结果数据进行并行计算,无需在一个线程执行完毕之后,再执行下一个线程,由此可以有效减少GPU中线程对原子计数器访问次数,提高原子计数器的性能以及操作效率。
本发明实施例提供的技术方案,通过获取GPU中的多个待处理的线程组,确定每个线程组对应的原子计数器;根据每个线程组对应的原子操作函数,确定与每个线程组匹配的加法指令;在多个线程组中依次获取一个线程组作为当前处理线程组,根据当前处理线程组匹配的加法指令、当前处理线程组对应原子计数器的原始数值,以及当前处理线程组中包括的多个线程,并行计算每个线程对应的结果数据的技术手段,可以有效减少GPU中线程对原子计数器访问次数,提高原子计数器的性能。
图2为本发明实施例二提供的一种原子计数器的操作方法的流程图,本实施例是对上述实施例的进一步细化。如图2所示,该方法包括:
步骤210、获取GPU中的多个待处理的线程组,确定每个线程组对应的原子计数器。
步骤220、根据每个线程组对应的原子操作函数,确定与每个线程组匹配的加法指令。
在本实施例的一个实施方式中,根据每个线程组对应的原子操作函数,确定与每个线程组匹配的加法指令,包括:获取每个线程组对应的原子操作函数,如果所述原子操作函数为分配函数allocate,则确定所述线程组匹配的加法指令为数值增加指令;如果所述原子操作函数为消费函数consume,则确定所述线程组匹配的加法指令为数值减少指令。
在一个具体的实施例中,所述数值增加指令可以为数值加1指令,数值减少指令可以为数值减1指令。
步骤230、在多个线程组中依次获取一个线程组作为当前处理线程组。
步骤240、获取当前处理线程组中多个线程的排列顺序,根据排列顺序统计每个线程之前的线程数量。
步骤250、根据当前处理线程组对应原子计数器的原始数值、当前处理线程组匹配的加法指令,以及每个线程之前的线程数量,并行计算每个线程对应的结果数据。
在本实施例中,对于当前处理线程组中某个线程,可以按照当前处理线程组匹配的加法指令,将原子计数器的原始数值,与该线程之前的线程数量进行相加或相减,得到该线程对应的结果数据。
在一个具体的实施例中,假设当前处理线程组中包括五个线程(线程A、线程B、线程C、线程D以及线程E),当前处理线程组匹配的加法指令为数值加1指令,原子计数器的原始数值为5。以线程C为例,该线程之前的线程数量为2,则可以按照数值加1指令,通过5+2+1得到结果数据8。
在另一个具体的实施例中,假设当前处理线程组中包括五个线程(线程A、线程B、线程C、线程D以及线程E),当前处理线程组匹配的加法指令为数值减1指令,原子计数器的原始数值为10。以线程C为例,该线程之前的线程数量为2,则可以按照数值减1指令,通过10-2-1得到结果数据7。
这样设置的好处在于,通过统计每个线程之前的线程数量,可以快速并行计算出每个线程对应的结果数据,提高原子计数器的操作效率。
在本实施例的一个实施方式中,在并行计算每个线程对应的结果数据之后,还包括:检测到全部线程对应的结果数据计算完成之后,对当前处理线程组对应原子计数器的原始数值进行更新,并将更新结果写入所述原子计数器。
在一个具体的实施例中,可以将当前处理线程组中最后一个线程对应的结果数据,作为所述更新结果写入原子计数器中。
这样设置的好处在于,通过对原子计数器的原始数值进行更新,便于其他线程组根据更新结果,快速确定对应线程的结果数据。
步骤260、判断是否完成对全部线程组的处理,若是,则确定所述原子计数器的操作方法执行结束,若否,则返回执行步骤230,直至完成对全部线程组的处理。
本实施例提供的技术方案,通过获取GPU中的多个待处理的线程组,确定每个线程组对应的原子计数器,根据每个线程组对应的原子操作函数,确定与每个线程组匹配的加法指令,在多个线程组中依次获取一个线程组作为当前处理线程组,获取当前处理线程组中多个线程的排列顺序,根据排列顺序统计每个线程之前的线程数量,根据当前处理线程组对应原子计数器的原始数值、当前处理线程组匹配的加法指令,以及每个线程之前的线程数量,并行计算每个线程对应的结果数据的技术手段,可以有效减少GPU中线程对原子计数器访问次数,提高原子计数器的性能。
图3为本发明实施例三提供的另一种原子计数器的操作方法的流程图,本实施例是对上述实施例的进一步细化。如图3所示,该方法包括:
步骤310、获取GPU中的多个待处理的线程组,建立与每个线程组一一对应的优化器,确定每个线程组对应的原子计数器。
在本实施例中,获取到GPU中的多个待处理的线程组后,可以建立与每个线程组分别对应的统一处理模块(也即优化器)。具体的,所述优化器可以为GPU中的硬件优化模块,或者也可以为硬件优化模块中的软件处理程序,本实施例对此并不进行限制。
步骤320、根据每个线程组对应的原子操作函数,确定与每个线程组匹配的加法指令。
步骤330、在多个线程组中依次获取一个线程组作为当前处理线程组。
步骤340、通过当前处理线程组对应的优化器,根据所述加法指令、当前处理线程组对应原子计数器的原始数值,以及当前处理线程组中包括的多个线程,并行计算每个线程对应的结果数据。
这样设置的好处在于,通过建立与每个线程组一一对应的优化器,可以将线程组中多个线程对应的原子操作合并为一个,避免多个线程对原子计数器进行同时访问,由此提高原子计数器的性能。
步骤350、检测到全部线程对应的结果数据计算完成之后,获取当前处理线程组中的全部线程数量,根据所述当前处理线程组匹配的加法指令,以及全部线程数量,生成对应原子计数器的数值更新指令。
在本实施例中,可以将当前处理线程组中的全部线程数量,作为加法指令中的数值增量,以得到数值更新指令。
在一个具体的实施例中,假设当前处理线程组匹配的加法指令为“ADD+1”(也即数值加1指令),当前处理线程组中的全部线程数量为N,则可以得到数值更新指令为“ADD+N”。
步骤360、根据所述数值更新指令,对所述原子计数器的原始数值进行更新。
在此步骤中,可以通过当前处理线程组对应的优化器,根据数值更新指令中的数值增量,对原始数值进行计算,得到更新后的原始数值。
这样设置的好处在于,通过优化器获取数值更新指令,可以快速对原子计数器的原始数值进行更新,提高原子计数器的操作效率。
步骤370、判断是否完成对全部线程组的处理,若是,则确定所述原子计数器的操作方法执行结束,若否,则返回执行步骤330,直至完成对全部线程组的处理。
本实施例提供的技术方案,通过获取GPU中的多个待处理的线程组,建立与每个线程组一一对应的优化器,确定每个线程组对应的原子计数器,根据每个线程组对应的原子操作函数,确定与每个线程组匹配的加法指令,在多个线程组中依次获取一个线程组作为当前处理线程组,通过当前处理线程组对应的优化器,根据加法指令、当前处理线程组对应原子计数器的原始数值,以及当前处理线程组中包括的多个线程,并行计算每个线程对应的结果数据,检测到全部线程对应的结果数据计算完成之后,获取当前处理线程组中的全部线程数量,根据当前处理线程组匹配的加法指令,以及全部线程数量,生成对应原子计数器的数值更新指令,根据数值更新指令,对原子计数器的原始数值进行更新的技术手段,可以有效减少GPU中线程对原子计数器访问次数,提高原子计数器的性能。
图4为本发明实施例四提供的一种原子计数器的操作装置的结构示意图,所述装置应用于电子设备中。如图4所示,该装置包括:线程组获取模块410、指令确定模块420和数据计算模块430。
其中,线程组获取模块410,用于获取GPU中的多个待处理的线程组,确定每个线程组对应的原子计数器;
指令确定模块420,用于根据每个线程组对应的原子操作函数,确定与每个线程组匹配的加法指令;
数据计算模块430,用于在多个线程组中依次获取一个线程组作为当前处理线程组,根据所述当前处理线程组匹配的加法指令、当前处理线程组对应原子计数器的原始数值,以及当前处理线程组中包括的多个线程,并行计算每个线程对应的结果数据。
本实施例提供的技术方案,通过获取GPU中的多个待处理的线程组,确定每个线程组对应的原子计数器;根据每个线程组对应的原子操作函数,确定与每个线程组匹配的加法指令;在多个线程组中依次获取一个线程组作为当前处理线程组,根据当前处理线程组匹配的加法指令、当前处理线程组对应原子计数器的原始数值,以及当前处理线程组中包括的多个线程,并行计算每个线程对应的结果数据的技术手段,可以有效减少GPU中线程对原子计数器访问次数,提高原子计数器的性能。
在上述实施例的基础上,所述线程组获取模块410包括:
优化器建立单元,用于建立与每个线程组一一对应的优化器。
所述指令确定模块420包括:
数值增加单元,用于获取每个线程组对应的原子操作函数,如果所述原子操作函数为分配函数,则确定所述线程组匹配的加法指令为数值增加指令;
数值减少单元,用于如果所述原子操作函数为消费函数,则确定所述线程组匹配的加法指令为数值减少指令。
所述数据计算模块430包括:
优化器处理单元,用于通过当前处理线程组对应的优化器,根据所述加法指令、当前处理线程组对应原子计数器的原始数值,以及当前处理线程组中包括的多个线程,并行计算每个线程对应的结果数据;
顺序获取单元,用于获取当前处理线程组中多个线程的排列顺序,根据排列顺序统计每个线程之前的线程数量;
并行计算单元,用于根据当前处理线程组对应原子计数器的原始数值、当前处理线程组匹配的加法指令,以及每个线程之前的线程数量,并行计算每个线程对应的结果数据;
数值更新单元,用于检测到全部线程对应的结果数据计算完成之后,对当前处理线程组对应原子计数器的原始数值进行更新,并将更新结果写入所述原子计数器;
更新指令生成单元,用于获取当前处理线程组中的全部线程数量,根据所述当前处理线程组匹配的加法指令,以及全部线程数量,生成对应原子计数器的数值更新指令;
更新指令处理单元,用于根据所述数值更新指令,对所述原子计数器的原始数值进行更新。
上述装置可执行本发明前述所有实施例所提供的方法,具备执行上述方法相应的功能模块和有益效果。未在本发明实施例中详尽描述的技术细节,可参见本发明前述所有实施例所提供的方法。
在上述实施方式的基础上,本申请还提供了一种电子设备,所述设备包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器。其中,所述存储器存储有可被所述至少一个处理器执行的计算机程序,所述计算机程序被所述至少一个处理器执行,以使所述至少一个处理器能够执行任一实施例所述的原子计数器的操作方法。
本申请还提供了一种计算机可读存储介质,其上存储有计算机指令,所述计算机指令用于使处理器执行时实现任一实施例所述的原子计数器的操作方法。
应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本发明中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本发明的技术方案所期望的结果,本文在此不进行限制。
上述具体实施方式,并不构成对本发明保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本发明的精神和原则之内所作的修改、等同替换和改进等,均应包含在本发明保护范围之内。