CN114924801B - 基于缓存拓扑的多核处理器线程唤醒方法 - Google Patents
基于缓存拓扑的多核处理器线程唤醒方法 Download PDFInfo
- Publication number
- CN114924801B CN114924801B CN202210581784.6A CN202210581784A CN114924801B CN 114924801 B CN114924801 B CN 114924801B CN 202210581784 A CN202210581784 A CN 202210581784A CN 114924801 B CN114924801 B CN 114924801B
- Authority
- CN
- China
- Prior art keywords
- node
- thread
- child
- wake
- parent
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/4401—Bootstrapping
- G06F9/4418—Suspend and resume; Hibernate and awake
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/545—Interprogram communication where tasks reside in different layers, e.g. user- and kernel-space
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Computer Security & Cryptography (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
本申请涉及一种基于缓存拓扑的多核处理器线程唤醒方法。所述方法包括:主线程构建缓存拓扑感知树,根据处理器缓存拓扑,确定感知树的拓扑结构,确定每个处理器核心所对应的树节点的子节点信息,主线程构建唤醒数组,各线程通过调用库函数获取线程号,将线程号赋值给临时变量,根据临时变量,确定线程的身份信息,根据临时变量和唤醒数组,确定线程唤醒的等待信息;根据临时变量、所述缓存拓扑感知树对应结构体数组、线程的身份信息和等待信息,进行多核处理器的线程唤醒。采用本方法能够有效减少唤醒过程开销,参与唤醒过程的线程数量越多,优化效果越明显。
Description
技术领域
本申请涉及多核处理器体系结构技术领域,特别是涉及一种基于缓存拓扑的多核处理器线程唤醒方法。
背景技术
单核芯片因性能受限于功耗,无法满足大规模应用计算的实际需要。目前,在单个芯片上集成多个处理器核心(即多核处理器)已成为主流的芯片设计方式。而充分利用片上多个计算核心以发挥其性能优势的关键在于实现多个核心的高效协同工作。多核处理器上不同核心之间经常需要进行核间通信协作,且核间通信的效率是影响并行程序的关键因素之一。
唤醒操作是多核通信协作的一个基本操作。在并行程序中,可能出现某些线程因为特定需求而自旋等待的现象,如线程在同步过程中提前到达栅栏。通知这些线程停止等待,继续执行后续程序的操作被称之为线程唤醒。线程唤醒的效率会严重影响并行程序的总体执行性能,实现对等待线程的高效唤醒至关重要。
在使用基于共享内存的多线程编程接口(如OpenMP)编写程序时,主线程通过改变某个或某些线程间共享变量的状态来实现对其他线程的唤醒。在多核处理器中,除了主存以外,会有一级或多级片上高速缓存,用以保存最近使用的数据。考虑到唤醒过程中涉及的共享变量一直位于各级缓存中,故而对共享变量的访问不涉及对主存的操作。因此,唤醒操作的开销可以简单建模为唤醒线程与等待(被唤醒)线程所对应核心之间的访问延迟。
核间访问延迟与多核处理器的缓存拓扑结构密切相关。其中,多层均匀缓存体系结构(Uniform Cache Architecture,UCA)是一种典型的多核处理器缓存拓扑结构。在UCA的处理器中,每个计算核心拥有私有的一级或两级缓存,片上多个核心共享一片最后一级缓存(Last Level Cache,LLC),且每个计算核心访问共享LLC的延迟是相同的。此外,还有更复杂的非均匀缓存体系结构(Non-Uniform Cache Architecture,NUCA)等缓存拓扑结构。在NUCA的处理器中,片上每个计算核心访问共享LLC的延迟可能不同。无论采用何种缓存拓扑结构,将共享同一块LLC且访问共享LLC延迟相同的一组计算核心称之为“核组”。总体而言,核组内的核间通信延迟远小于核组间的核间通信延迟,因此针对多核处理器实现多线程唤醒时应该考虑处理器缓存拓扑结构。
发明内容
基于此,有必要针对上述技术问题,提供一种基于缓存拓扑的多核处理器线程唤醒方法。
一种基于缓存拓扑的多核处理器线程唤醒方法,所述方法包括:
主线程构建缓存拓扑感知树,根据处理器缓存拓扑,确定感知树的拓扑结构,确定每个处理器核心所对应的树节点的子节点信息;所述缓存拓扑感知树为结构体数组,所述结构体数组的结构体数等于多核处理器的核心数,所述结构体数组中四个域分别为:从左子节点left_child,从右子节点right_child,主左子节点numa_left_child,主右子节点numa_right_child,各个域的初始值赋值为第一状态值;
主线程构建唤醒数组;所述唤醒数组的大小为核心数的16倍,所述唤醒数组中记录每个核心的唤醒标志位;所述唤醒标志位的初始值为第二状态值;
各线程通过调用库函数获取线程号,将所述线程号赋值给临时变量,根据所述临时变量,确定线程的身份信息,根据所述临时变量和所述唤醒数组,确定线程的等待信息;
根据所述临时变量、所述缓存拓扑感知树对应结构体数组、所述线程的身份信息和等待信息,进行多核处理器的线程唤醒。
在其中一个实施例中,还包括:从0到MAX_THREADS-1,依次遍历结构体数组nodes的每一项nodes[i];其中,MAX_THREADS表示核心总数,i表示缓存拓扑感知树中节点的序号;若i能够整除NUMA_MAX,则i为主节点,否则i为从节点;其中,NUMA_MAX表示核组中的核心数量。
在其中一个实施例中,还包括:当节点i为主节点时,计算i除以NUMA_MAX的商q,节点i的父节点parent为[(q-1)/2]×NUMA_MAX;若q-1能够整除2,则节点i是其父节点parent的左主子节点,修改父节点parent的域nodes[parent].numa_left_child的值为i,否则节点i是其父节点parent的右主子节点,修改父节点parent的域nodes[parent].numa_right_child的值为i。
在其中一个实施例中,还包括:当节点i为从节点时,计算i除以NUMA_MAX的余数r,节点i的父节点parent为[(r-1)/2]+[i/NUMA_MAX]×NUMA_MAX;
若r-1能够整除2,则节点i是其父节点parent的左从子节点,修改父节点parent的域nodes[parent].left_child的值为i,否则,节点i是其父节点parent的右从子节点,修改父节点parent的域nodes[parent].right_child的值为i。
在其中一个实施例中,所述第一状态值设置为-1。
在其中一个实施例中,述唤醒数组wake_up的数组大小为MAX_THREADS*16,所述唤醒数组wake_up为唤醒标志数组,所述唤醒标志数组中每16项对应一个线程,线程i的唤醒标志为wake_up[i*16],第二状态值为0。
在其中一个实施例中,还包括:若临时变量为0,则线程为根节点;若临时变量能够整除NUMA_MAX,则线程为主节点;否则为从节点。
在其中一个实施例中,还包括:线程访问唤醒数组对应项wake_up[myid];其中,myid表示临时变量;若wake_up[myid]的值为0,则线程执行while循环,轮询wake_up[myid],直至wake_up[myid]的值不为0,则结束while循环,并结束等待。
在其中一个实施例中,还包括:若线程为根节点或主节点,则唤醒其所有主子节点;唤醒左主子节点:将主节点的域nodes[myid].numa_left_child的值赋值给临时变量numa_left_child,如果值为-1,则线程没有任何主子节点,执行从子节点的唤醒;否则将唤醒数组wake_up对应项wake_up[numa_left_child]的值置为1;唤醒右主子节点:将主节点的域nodes[myid].numa_right_child的值赋值给临时变量numa_right_child,如果值为-1,则线程没有右主子节点,执行从子节点的唤醒;否则将唤醒数组wake_up对应项wake_up[numa_right_child]的值置为1。
在其中一个实施例中,还包括:唤醒当前线程所有从子节点;唤醒左从子节点:将主节点的域nodes[myid].left_child的值赋值给临时变量left_child,如果值为-1,则线程没有任何从子节点;否则将唤醒数组wake_up对应项wake_up[left_child]的值置为1;唤醒右从子节点:将主节点的域nodes[myid].right_child的值赋值给临时变量right_child,如果值为-1,则线程没有右从子节点;否则将唤醒数组wake_up对应项wake_up[right_child]的值置为1。
上述基于缓存拓扑的多核处理器线程唤醒方法,将多核处理器的计算核心按照访问LLC的延迟进行分组,最大限度地将唤醒过程中可能发生的核间通信控制在具有相同LLC访问延迟的一个核组内、尽量避免核组间的通信,从而降低唤醒开销、提升多线程协同工作效率。以飞腾处理器为例,一方面,该唤醒机制在64线程时只涉及15次跨核组通信,相比常用的二叉树唤醒算法降低了三倍之多;另一方面,保留树形结构,每个共享标志只在一对父子节点中共享,避免了全局唤醒算法中主线程更改唤醒标志时作废所有副本的开销以及多线程访问唤醒标志产生的竞争。此外,在本发明中,设置每个唤醒标志的大小为整个缓存行而不是一个数组,避免了唤醒不同节点之间可能产生的互相干扰。本发明可以有效减少唤醒过程开销,参与唤醒过程的线程数量越多,优化效果越明显。
附图说明
图1为一个实施例中基于缓存拓扑的多核处理器线程唤醒方法的流程示意图;
图2为一个实施例中构建缓存拓扑感知树结构体数组步骤的流程示意图;
图3为一个实施例中唤醒等待线程步骤的流程示意图;
图4为一个实施例中缓存拓扑感知树的结构示意图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
在一个实施例中,如图1所示,提供了一种基于缓存拓扑的多核处理器线程唤醒方法,包括以下步骤:
步骤102,主线程构建缓存拓扑感知树,根据处理器缓存拓扑,确定感知树的拓扑结构,确定每个处理器核心所对应的树节点的子节点信息。
缓存拓扑感知树为结构体数组,结构体数组的结构体数等于多核处理器的核心数,结构体数组中四个域分别为:从左子节点left_child,从右子节点right_child,主左子节点numa_left_child,主右子节点numa_right_child,各个域的初始值赋值为第一状态值。
本步骤中,所应用的多核处理器具有多核组且采用均匀缓存架构(UCA),例如:飞腾处理器、骁龙处理器等。其中核组是指共享同一块LLC的一组计算核心。以飞腾处理器为例,飞腾处理器是一款兼容ARMv8指令集,采用非一致访问存储(Non-uniform memoryaccess,NUMA)技术组织片上缓存的多核处理器。飞腾处理器片内集成64个计算核心,其中每4个计算核心构成一个核组,共享L2缓存。对飞腾处理器而言,位于同一核组内的核心相互访问延迟相同且极小,跨核组的核心之间的延迟很大,且取决于两核组之间的距离。现有的两种典型的唤醒方式(全局唤醒和二叉树唤醒)会产生过多的跨核组读或写操作,从而导致额外的唤醒开销。
本步骤引入一个树节点结构体node,存放每个缓存拓扑感知树节点的子节点信息,包括四个域:从左子节点left_child,从右子节点right_child,主左子节点numa_left_child,主右子节点numa_right_child。预定义MAX_THREADS值为飞腾处理器计算核心数,即64;NUMA_MAX值为一个核组中的计算核心数,即4。结构体数组nodes中每个数据元素为一个node结构体,数组的第i项对应第i个缓存拓扑感知树节点,即线程i。
步骤104,主线程构建唤醒数组。
唤醒数组的大小为核心数的16倍,唤醒数组中记录每个核心的唤醒标志位;唤醒标志位的初始值为第二状态值。
步骤106,各线程通过调用库函数获取线程号,将线程号赋值给临时变量,根据临时变量、缓存拓扑感知树和身份信息,确定线程的身份信息,根据临时变量和唤醒数组,确定线程唤醒的等待信息。
步骤108,根据临时变量、缓存拓扑感知树对应结构体数组、线程的身份信息和等待信息,进行多核处理器的线程唤醒。
上述基于缓存拓扑的多核处理器线程唤醒方法,将多核处理器的计算核心按照访问LLC的延迟进行分组,最大限度地将唤醒过程中可能发生的核间通信控制在具有相同LLC访问延迟的一个核组内、尽量避免核组间的通信,从而降低唤醒开销、提升多线程协同工作效率。以飞腾处理器为例,一方面,该唤醒机制在64线程时只涉及15次跨核组通信,相比常用的二叉树唤醒算法降低了三倍之多;另一方面,保留树形结构,每个共享标志只在一对父子节点中共享,避免了全局唤醒算法中主线程更改唤醒标志时作废所有副本的开销以及多线程访问唤醒标志产生的竞争。此外,在本发明中,设置每个唤醒标志的大小为整个缓存行而不是一个数组,避免了唤醒不同节点之间可能产生的互相干扰。本发明可以有效减少唤醒过程开销,参与唤醒过程的线程数量越多,优化效果越明显。
在其中一个实施例中,从0到MAX_THREADS-1,依次遍历结构体数组nodes的每一项nodes[i];其中,MAX_THREADS表示核心总数,i表示缓存拓扑感知树中节点的序号;若i能够整除NUMA_MAX,则i为主节点,否则i为从节点;其中,NUMA_MAX表示核组中的核心数量。
在其中一个实施例中,当节点i为主节点时,计算i除以NUMA_MAX的商q,节点i的父节点parent为[(q-1)/2]×NUMA_MAX;;若q-1能够整除2,则节点i是其父节点parent的左主子节点,修改父节点parent的域nodes[parent].numa_left_child的值为i,否则节点i是其父节点parent的右主子节点,修改父节点parent的域nodes[parent].numa_right_child的值为i。
在另一个实施例中,当节点i为从节点时,计算i除以NUMA_MAX的余数r,节点i的父节点parent为[(r-1)/2]+[i/NUMA_MAX]×NUMA_MAX;若r-1能够整除2,则节点i是其父节点parent的左从子节点,修改父节点parent的域nodes[parent].left_child的值为i,否则,节点i是其父节点parent的右从子节点,修改父节点parent的域nodes[parent].right_child的值为i。
具体的,如图2所示,构建缓存拓扑感知树结构体数组的具体步骤为:
1.0从0到MAX_THREADS-1,依次遍历结构体数组nodes的每一项nodes[i],确定每个树节点的身份,方法是:
1.1如果i能够整除NUMA_MAX,说明i是主节点,执行1.2;否则,i是从节点,执行1.3。
1.2计算主节点i的父节点parent,修改parent对应node结构体的相应域,方法是:
1.2.1计算i除以NUMA_MAX的商q。
1.2.2计算节点i对应的父节点parent,方法是:计算q-1除以2的商后乘于NUMA_MAX。
1.2.3判断q-1是否能够整除2,如果能,说明i是parent的左主子节点,修改nodes[parent].numa_left_child的值为i;否则,i是parent的右主子节点,修改nodes[parent].numa_right_child的值为i。
1.3计算从节点i的父节点parent,修改parent对应node结构体的相应域,方法是:
1.3.1计算i除以NUMA_MAX的余数r。
1.3.2计算节点i对应的父节点parent,方法是:计算r-1除以2的商后加上i除以NUMA_MAX的商乘于NUMA_MAX。
1.3.3判断r-1是否能够整除2,如果能,说明i是parent的左从子节点,修改nodes[parent].left_child的值为i;否则,i是parent的右从子节点,修改nodes[parent].right_child的值为i。
在其中一个实施例中,第一状态值设置为-1。
在其中一个实施例中,唤醒数组wake_up的数组大小为MAX_THREADS*16,所述唤醒数组wake_up为唤醒标志数组,唤醒标志数组中每16项对应一个线程,线程i的唤醒标志为wake_up[i*16],第二状态值为0。
在其中一个实施例中,若临时变量为0,则线程为根节点;若临时变量能够整除NUMA_MAX,则线程为主节点;否则为从节点。
在其中一个实施例中,线程访问唤醒数组对应项wake_up[myid];其中,myid表示临时变量;若wake_up[myid]的值为0,则线程执行while循环,轮询wake_up[myid],直至wake_up[myid]的值不为0,则结束while循环,并结束等待。
在又一个实施例中,若线程为根节点或主节点,则唤醒其所有主子节点;唤醒左主子节点:将主节点的域nodes[myid].numa_left_child的值赋值给临时变量numa_left_child,如果值为-1,则线程没有任何主子节点,执行从子节点的唤醒;否则将唤醒数组wake_up对应项wake_up[numa_left_child]的值置为1;唤醒右主子节点:将主节点的域nodes[myid].numa_right_child的值赋值给临时变量numa_right_child,如果值为-1,则线程没有右主子节点,执行从子节点的唤醒;否则将唤醒数组wake_up对应项wake_up[numa_right_child]的值置为1。
在另一个实施例中,唤醒当前线程所有从子节点;唤醒左从子节点:将主节点的域nodes[myid].left_child的值赋值给临时变量left_child,如果值为-1,则线程没有任何从子节点;否则将唤醒数组wake_up对应项wake_up[left_child]的值置为1;唤醒右从子节点:将主节点的域nodes[myid].right_child的值赋值给临时变量right_child,如果值为-1,则线程没有右从子节点;否则将唤醒数组wake_up对应项wake_up[right_child]的值置为1。
具体的,如图3所示,唤醒等待线程的步骤包括:
2.1线程判断自己是否为根节点(主线程),方法是:
2.1.1线程调用omp_get_thread_num()获取线程号,赋值给临时变量myid。
2.1.2如果myid值为0,说明线程为根节点,无需判断是否继续等待,直接执行2.4;否则,执行2.2。
2.2线程判断自己是否需要等待,方法是:线程访问唤醒数组对应项wake_up[myid],如果值为0,线程执行while循环,不断轮询wake_up[myid];反之,线程结束while循环,执行3.3。
2.3线程判断自己是否为主节点,方法是:如果myid能够整除NUMA_MAX,说明线程为主节点,执行2.4;否则,执行2.5。
2.4线程依次唤醒所有主子节点,方法是:
2.4.1唤醒左主子节点,将nodes[myid].numa_left_child的值赋值给临时变量numa_left_child,如果值为-1,说明线程没有任何主子节点,执行3.5;否则将唤醒数组wake_up对应项wake_up[numa_left_child]的值置为1。
2.4.2唤醒右主子节点,将nodes[myid].numa_right_child的值赋值给临时变量numa_right_child,如果值为-1,说明线程没有右主子节点,执行3.5;否则将唤醒数组wake_up对应项wake_up[numa_right_child]的值置为1。
2.5线程依次唤醒所有从子节点,方法是:
2.5.1唤醒左从子节点,将nodes[myid].left_child的值赋值给临时变量left_child,如果值为-1,说明线程没有任何从子节点,执行2.6;否则将唤醒数组wake_up对应项wake_up[left_child]的值置为1。
2.5.2唤醒右从子节点,将nodes[myid].right_child的值赋值给临时变量right_child,如果值为-1,说明线程没有右从子节点,执行2.6;否则将唤醒数组wake_up对应项wake_up[right_child]的值置为1。
2.6线程重置各自的唤醒标志,以便下一次唤醒使用。方法是:线程将自己对应的唤醒标志wake_up[myid]的值置为0。
最终,缓存拓扑感知树如图4所示。
应该理解的是,虽然图1-3的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图1-3中的至少一部分步骤可以包括多个子步骤或者多个阶段,这些子步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些子步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤的子步骤或者阶段的至少一部分轮流或者交替地执行。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和/或易失性存储器。非易失性存储器可包括只读存储器(ROM)、可编程ROM(PROM)、电可编程ROM(EPROM)、电可擦除可编程ROM(EEPROM)或闪存。易失性存储器可包括随机存取存储器(RAM)或者外部高速缓冲存储器。作为说明而非局限,RAM以多种形式可得,诸如静态RAM(SRAM)、动态RAM(DRAM)、同步DRAM(SDRAM)、双数据率SDRAM(DDRSDRAM)、增强型SDRAM(ESDRAM)、同步链路(Synchlink)DRAM(SLDRAM)、存储器总线(Rambus)直接RAM(RDRAM)、直接存储器总线动态RAM(DRDRAM)、以及存储器总线动态RAM(RDRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (10)
1.一种基于缓存拓扑的多核处理器线程唤醒方法,其特征在于,所述方法包括:
主线程构建缓存拓扑感知树,根据处理器缓存拓扑,确定感知树的拓扑结构,确定每个处理器核心所对应的树节点的子节点信息;所述缓存拓扑感知树为结构体数组,所述结构体数组的结构体数等于多核处理器的核心数,所述结构体数组中四个域分别为:从左子节点left_child,从右子节点right_child,主左子节点numa_left_child,主右子节点numa_right_child,各个域的初始值赋值为第一状态值;
主线程构建唤醒数组;所述唤醒数组的大小为核心数的16倍,所述唤醒数组中记录每个核心的唤醒标志位;所述唤醒标志位的初始值为第二状态值;
各线程通过调用库函数获取线程号,将所述线程号赋值给临时变量,根据所述临时变量,确定线程的身份信息,根据所述临时变量和所述唤醒数组,确定线程的等待信息;
根据所述临时变量、所述缓存拓扑感知树对应结构体数组、所述线程的身份信息和等待信息,进行多核处理器的线程唤醒。
2.根据权利要求1所述的方法,其特征在于,所述根据处理器缓存拓扑,确定感知树的拓扑结构,确定每个核心所对应的树节点的子节点信息,包括:
从0到MAX_THREADS-1,依次遍历结构体数组nodes的每一项nodes[i];其中,MAX_THREADS表示核心总数,i表示缓存拓扑感知树中节点的序号;
若i能够整除NUMA_MAX,则i为主节点,否则i为从节点;其中,NUMA_MAX表示核组中的核心数量。
3.根据权利要求2所述的方法,其特征在于,所述根据处理器缓存拓扑,确定感知树的拓扑结构,确定每个核心所对应的树节点的子节点信息,包括:
当节点i为主节点时,计算i除以NUMA_MAX的商q,节点i的父节点parent为[(q-1)/2]×NUMA_MAX;
若q-1能够整除2,则节点i是其父节点parent的左主子节点,修改父节点parent的域nodes[parent].numa_left_child的值为i,否则节点i是其父节点parent的右主子节点,修改父节点parent的域nodes[parent].numa_right_child的值为i。
4.根据权利要求2所述的方法,其特征在于,所述根据处理器缓存拓扑,确定感知树的拓扑结构,确定每个核心所对应的树节点的子节点信息,包括:
当节点i为从节点时,计算i除以NUMA_MAX的余数r,节点i的父节点parent为[(r-1)/2]+[i/NUMA_MAX]×NUMA_MAX;
若r-1能够整除2,则节点i是其父节点parent的左从子节点,修改父节点parent的域nodes[parent].left_child的值为i,否则,节点i是其父节点parent的右从子节点,修改父节点parent的域nodes[parent].right_child的值为i。
5.根据权利要求1至4任一项所述的方法,其特征在于,所述第一状态值设置为-1。
6.根据权利要求1所述的方法,其特征在于,所述唤醒数组wake_up的数组大小为MAX_THREADS*16,所述唤醒数组wake_up为唤醒标志数组,所述唤醒标志数组中每16项对应一个线程,线程i的唤醒标志为wake_up[i*16],第二状态值为0。
7.根据权利要求1所述的方法,其特征在于,根据所述临时变量,确定线程的身份信息,包括:
若临时变量为0,则线程为根节点;
若临时变量能够整除NUMA_MAX,则线程为主节点;
否则为从节点。
8.根据权利要求7所述的方法,其特征在于,根据所述临时变量和所述唤醒数组,确定线程唤醒的等待信息,包括:
线程访问唤醒数组对应项wake_up[myid];其中,myid表示临时变量;
若wake_up[myid]的值为0,则线程执行while循环,轮询wake_up[myid],直至wake_up[myid]的值不为0,则结束while循环,并结束等待。
9.根据权利要求7所述的方法,其特征在于,根据所述临时变量、所述缓存拓扑感知树对应结构体数组、所述线程的身份信息和等待信息,进行多核处理器的线程唤醒,包括:
若线程为根节点或主节点,则唤醒其所有主子节点;
唤醒左主子节点:将主节点的域nodes[myid].numa_left_child的值赋值给临时变量numa_left_child,如果值为-1,则线程没有任何主子节点,执行从子节点的唤醒;否则将唤醒数组wake_up对应项wake_up[numa_left_child]的值置为1;
唤醒右主子节点:将主节点的域nodes[myid].numa_right_child的值赋值给临时变量numa_right_child,如果值为-1,则线程没有右主子节点,执行从子节点的唤醒;否则将唤醒数组wake_up对应项wake_up[numa_right_child]的值置为1。
10.根据权利要求7所述的方法,其特征在于,所述临时变量、所述缓存拓扑感知树对应结构体数组、所述线程的身份信息和等待信息,进行多核处理器的线程唤醒,包括:
唤醒当前线程所有从子节点;
唤醒左从子节点:将主节点的域nodes[myid].left_child的值赋值给临时变量left_child,如果值为-1,则线程没有任何从子节点;否则将唤醒数组wake_up对应项wake_up[left_child]的值置为1;
唤醒右从子节点:将主节点的域nodes[myid].right_child的值赋值给临时变量right_child,如果值为-1,则线程没有右从子节点;否则将唤醒数组wake_up对应项wake_up[right_child]的值置为1。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210581784.6A CN114924801B (zh) | 2022-05-26 | 2022-05-26 | 基于缓存拓扑的多核处理器线程唤醒方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202210581784.6A CN114924801B (zh) | 2022-05-26 | 2022-05-26 | 基于缓存拓扑的多核处理器线程唤醒方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN114924801A CN114924801A (zh) | 2022-08-19 |
CN114924801B true CN114924801B (zh) | 2023-09-15 |
Family
ID=82811368
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202210581784.6A Active CN114924801B (zh) | 2022-05-26 | 2022-05-26 | 基于缓存拓扑的多核处理器线程唤醒方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114924801B (zh) |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20090102152A (ko) * | 2008-03-25 | 2009-09-30 | 경희대학교 산학협력단 | 비콘 비가용 모드의 저전력 지그비 센서 네트워크 시스템및 그에 따른 네트워크 통신 방법 |
CN102346684A (zh) * | 2010-06-01 | 2012-02-08 | 微软公司 | 将虚拟高速缓存拓扑结构展示给客操作系统 |
CN103970602A (zh) * | 2014-05-05 | 2014-08-06 | 华中科技大学 | 一种面向x86多核处理器的数据流程序调度方法 |
CN104834505A (zh) * | 2015-05-13 | 2015-08-12 | 华中科技大学 | 一种多核多线程环境下numa感知的同步方法 |
CN110175071A (zh) * | 2019-04-09 | 2019-08-27 | 南昌嘉研科技有限公司 | 一种多线程程序架构方法及架构系统 |
CN111669286A (zh) * | 2020-05-13 | 2020-09-15 | 深圳市三旺通信股份有限公司 | 一种网管系统中拓扑图树形布局生成方法 |
CN113724343A (zh) * | 2021-07-30 | 2021-11-30 | 西安电子科技大学 | 一种基于结构感知的树木点云压缩方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9632822B2 (en) * | 2012-09-21 | 2017-04-25 | Htc Corporation | Multi-core device and multi-thread scheduling method thereof |
-
2022
- 2022-05-26 CN CN202210581784.6A patent/CN114924801B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20090102152A (ko) * | 2008-03-25 | 2009-09-30 | 경희대학교 산학협력단 | 비콘 비가용 모드의 저전력 지그비 센서 네트워크 시스템및 그에 따른 네트워크 통신 방법 |
CN102346684A (zh) * | 2010-06-01 | 2012-02-08 | 微软公司 | 将虚拟高速缓存拓扑结构展示给客操作系统 |
CN103970602A (zh) * | 2014-05-05 | 2014-08-06 | 华中科技大学 | 一种面向x86多核处理器的数据流程序调度方法 |
CN104834505A (zh) * | 2015-05-13 | 2015-08-12 | 华中科技大学 | 一种多核多线程环境下numa感知的同步方法 |
CN110175071A (zh) * | 2019-04-09 | 2019-08-27 | 南昌嘉研科技有限公司 | 一种多线程程序架构方法及架构系统 |
CN111669286A (zh) * | 2020-05-13 | 2020-09-15 | 深圳市三旺通信股份有限公司 | 一种网管系统中拓扑图树形布局生成方法 |
CN113724343A (zh) * | 2021-07-30 | 2021-11-30 | 西安电子科技大学 | 一种基于结构感知的树木点云压缩方法 |
Non-Patent Citations (1)
Title |
---|
基于MPI的进程拓扑感知映射研究;李东洋;王云岚;;微电子学与计算机(第05期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN114924801A (zh) | 2022-08-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8108696B2 (en) | Optimizing non-preemptible read-copy update for low-power usage by avoiding unnecessary wakeups | |
JP5752326B2 (ja) | マルチコアコンピューティングデバイスのための動的スリープ | |
US20080098180A1 (en) | Processor acquisition of ownership of access coordinator for shared resource | |
CN101253483B (zh) | 管理资源锁的方法和系统 | |
KR102398912B1 (ko) | 데이터를 프로세싱하기 위한 방법 및 프로세서 | |
US20220147404A1 (en) | Method And Apparatus For Accessing Critical Resource, Computer Device, And Readable Storage Medium | |
EP3230860B1 (en) | Technologies for efficient synchronization barriers with work stealing support | |
JP2018534676A (ja) | 競合の存在下での効率的なタスクスケジューリングのための方法 | |
CN110704112B (zh) | 在区块链中并发执行交易的方法和装置 | |
JP2018534676A5 (zh) | ||
CN103299281A (zh) | 防止硬件事务存储器系统非故意丢失事务数据 | |
US9910717B2 (en) | Synchronization method | |
CN110032450B (zh) | 一种基于固态盘扩展内存的大规模深度学习方法及系统 | |
CN114924801B (zh) | 基于缓存拓扑的多核处理器线程唤醒方法 | |
US20210255793A1 (en) | System and method for managing conversion of low-locality data into high-locality data | |
TW202131193A (zh) | 應用資料標籤在多計算單元平台上的資料共用方法 | |
US9760145B2 (en) | Saving the architectural state of a computing device using sectors | |
JP2014164664A (ja) | タスク並列処理方法、装置及びプログラム | |
Yan et al. | QTMS: A quadratic time complexity topology-aware process mapping method for large-scale parallel applications on shared HPC system | |
US8868845B1 (en) | Dynamic single/multi-reader, single-writer spinlocks | |
CN104881840B (zh) | 一种基于图数据处理系统的数据并行访问方法 | |
Sangeetha et al. | A survey of hardware signature implementations in multi-core systems | |
CN116149574B (zh) | Raid阵列的管理方法、装置、raid卡及存储介质 | |
CN112579481B (zh) | 数据处理方法、数据处理装置和计算装置 | |
Blühdorn et al. | Local Adjoints for Simultaneous Preaccumulations with Shared Inputs |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |