CN109376022B - 一种提升Halide语言在多核系统执行效率的线程模型实现方法 - Google Patents
一种提升Halide语言在多核系统执行效率的线程模型实现方法 Download PDFInfo
- Publication number
- CN109376022B CN109376022B CN201811145982.8A CN201811145982A CN109376022B CN 109376022 B CN109376022 B CN 109376022B CN 201811145982 A CN201811145982 A CN 201811145982A CN 109376022 B CN109376022 B CN 109376022B
- Authority
- CN
- China
- Prior art keywords
- thread
- sthread
- shared
- stack
- child
- 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
Images
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/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/52—Program synchronisation; Mutual exclusion, e.g. by means of semaphores
Abstract
本发明公开了一种提升Halide语言在多核系统执行效率的线程模型Sthread实现方法,每个线程在内核中拥有独立的内存管理结构,从而避免线程间因共享地址空间导致的内存管理结构的竞争;与此同时,Sthread保持原有线程模型支持的共享变量语义,在线程之间共享栈数据、堆数据和全局数据。
Description
技术领域
本发明涉及图像处理语言与多核任务并行技术领域,尤其涉及一种提升Halide语言在多核系统执行效率的线程模型实现方法。
背景技术
Halide是一种面向图像处理的领域专用语言,它已被证明可以有效地用于编写高性能图像处理代码,广泛地应用于数据中心和移动设备上。Halide在语言层面上解耦了算法的定义(算法)和计算的组织(调度),使得程序员可以尝试多种策略以发现高性能的调度方案。
Halide将图像处理操作表示为定义在多维无限整数域上的纯函数,每个函数是像素坐标到函数值的映射。图像处理管线(pipeline)则表达为由上述纯函数组成的有向无环图,其中每个纯函数由程序员指定具体的计算组织策略,包括求值顺序、并发模式、内存分配与中间数据放置等。在算法定义和计算组织都明确后,Halide编译器会将二者综合为目标硬件架构上的具体实现代码。
对于多核CPU平台,Halide使用非常简单的并行机制来支持纯函数循环求值的并行迭代。这种机制导致生成的多核CPU架构的代码往往由于数据竞争或者频繁的最外层数据访问的缓存失效导致并发执行效率低。图1展示了Halide基于Pthread线程池的循环并行执行机制。工作线程通过调用运行时接口halide_do_par_for(后简称par_for)将并行循环体执行的任务、循环的剩余和最大迭代次数封装为Work对象提交到全局工作栈(GlobalWork Container)中,即图1中的①;另一方面,空闲工作线程竞争获取全局工作栈顶Work对象的剩余迭代并执行,即图1中的②。
图1所示机制是Halide发掘任务级并行的唯一机制。理想情况下,任务加速比应随着使用的CPU物理核数量或线程数量线性增长,但实际的测试结果显示:Halide在多核计算机系统下存在严重的并发扩展性问题。图2中上方四条曲线表现出4个测试程序在加速比随CPU核数的变化上有相同的趋势:随着CPU核数从8开始增长,测试程序的加速比先以线性模式缓慢增长;当CPU核数超过某个具体数值时,加速比不再增长甚至回落。对于另外2个测试程序interpolate和blur,直观地看,CPU核数对加速比几乎没有影响。
当Halide基准测试程序有充足的并发任务量时,使用更多CPU核去执行该程序时,加速比却没有得到持续提升。经深入分析发现,图像处理中的某些典型计算模式(如金字塔卷积)会消耗大量动态内存,这会引起频繁的内核地址空间管理操作。如表1所示,采用金字塔卷积的三个测试程序(interpolate、lens_blur和local_laplacian)的动态内存占用峰值超过1GB,而相应的缺页中断开销明显大于其他三个测试程序。缺页中断开销主要来自于内核中多个线程共享内存管理结构上读写锁的获取。
表1Halide测试程序动态内存占用与内核内存操作开销占比
发明内容
本发明的目的是提供一种提升Halide语言在多核系统执行效率的线程模型Sthread(Scalable thread,可伸缩线程)实现方法,极大地提升了Halide在多核计算机系统上的并发执行效率。
本发明的目的是通过以下技术方案实现的:
一种提升Halide语言在多核系统执行效率的线程模型Sthread实现方法,包括:
建立数据共享机制:在main函数运行之前,创建共享匿名映射来实现多线程间堆数据共享,同时,通过创建共享匿名映射并使用2copy-2map方法、栈迁移方法对应地实现全局数据共享、栈数据共享;
在Linux下,调用函数clone来创建Sthread子线程,使得Sthread子线程能够按照所建立的数据共享机制实现子线程与其父线程之间各种数据的共享;
在Halide运行时,使用所创建的Sthread子线程替换原有的Pthread重新实现Halide运行时系统中的halide_spawn_thread接口。
由上述本发明提供的技术方案可以看出,每个Sthread线程在内核中拥有独立的内存管理结构,从而避免线程间因共享地址空间导致的内存管理结构的竞争;与此同时,Sthread保持原有线程模型支持的共享变量语义,在线程之间共享栈数据、堆数据和全局数据。
附图说明
为了更清楚地说明本发明实施例的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍。显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域的普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他附图。
图1为本发明背景技术提供的Halide循环并行机制示意图;
图2为本发明背景技术提供的多核环境下Halide基准测试程序加速比曲线;
图3为本发明实施例提供的一种提升Halide语言在多核系统执行效率的线程模型实现方法的流程图;
图4为本发明实施例提供的Shalide与Halide性能对比示意图;
图5为本发明实施例提供的Shalide相较于Halide运行效率提升示意图;
图6为本发明实施例提供的数据共享设置方式示意图;
图7为本发明实施例提供的采用2copy-2map方法实现全局数据共享示意图;
图8为本发明实施例提供的主线程栈迁移示意图。
具体实施方式
下面结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明的保护范围。
本发明实施例提供的一种提升Halide语言在多核系统执行效率的线程模型实现方法,如图1所示,其主要包括:
1、建立数据共享机制:在main函数运行之前,创建共享匿名映射来实现多线程间堆数据共享,同时,通过创建共享匿名映射并使用2copy-2map方法、栈迁移方法对应地实现全局数据共享、栈数据共享。
数据共享机制主要包括:堆数据共享机制、全局数据共享机制与栈数据共享机制;通过创建的三个共享匿名映射来各自实现三种数据的共享,下面针对每一共享机制做详细介绍:
1)堆数据共享机制。
在main函数(主函数)运行之前,调用Linux系统调用函数mmap(addr,length,prot,flags,fd,offset)创建共享匿名的地址空间映射区间,作为全局共享的堆数据空间。其中:addr和length参数分别表示所映射区间的起始地址和长度;prot参数用于设置对所映射区间的访问模式,如可写、执行等;flags参数置为MAP_ANON|MAP_SHARED,分别表示所映射的区间为匿名映射和共享映射,fd与offset均置为0。设置所创建的映射区间为共享匿名映射,可以使得线程在调用函数clone()后该映射区间不受Linux进程缺省的写时复制(Copy on Write)机制的影响,从而实现多线程间数据映射的共享。
2)全局数据共享机制。
全局数据包括只读数据和可读写数据。前者因为只读的关系,在线程调用clone()之后永远不会触发该内存映射的Copy on Write机制,从而在线程间保证该内存映射数据的一致性,无需额外处理。因此,此处的全局数据共享是指对可读写数据区的共享,主线程的可读写数据区在线程启动时是由操作系统分配的私有地址空间映射;在POSIX操作系统接口规范中,没有直接提供可以修改映射共享属性的操作接口。考虑到内存映射是可以被覆盖的,因此通过设计2copy-2map方法实现全局数据共享,同时,全局数据共享时所使用的共享匿名映射为固定共享匿名映射,其创建方式与前文介绍的类似,可通过调用mmap()创建固定共享匿名内存映射,flags参数置为MAP_SHARED|MAP_ANON|MAP_FIXED。2copy-2map方法实现全局数据共享的方式如下:先分配临时空间存储可读写数据区的副本,然后使用预先创建的固定共享匿名映射覆盖原有可读写数据区的内存映射,再将临时空间内的数据拷贝回原有地址空间。
3)栈数据共享机制。
栈数据共享分为主线程栈数据共享和子线程栈数据共享两种情况。由于子线程的栈地址空间采取直接从共享的堆地址空间中分配获得,因此子线程的栈地址空间可直接支持数据共享。而对于主线程的栈地址空间,由于主线程启动时操作系统分配给主线程的是私有地址空间映射,因此需要设计额外的操作来确保主线程的栈数据共享。为保护栈上线程执行上下文的完整性,通过栈迁移方法实现主线程栈数据的共享,即在开始执行任务之前先将栈数据拷贝到预先创建的共享匿名映射,然后将当前硬件栈帧寄存器的值保存起来,再使之指向共享匿名映射中的栈顶栈帧;待主线程的任务执行完成,将之前保存的栈帧寄存器的值恢复到栈帧寄存器中。
2、在Linux下,调用函数clone来创建Sthread子线程,使得Sthread子线程能够按照所建立的数据共享机制实现子线程与其父线程之间各种数据的共享。
本发明实施例中,通过调用Linux系统调用函数clone(fn,child_stack,flags,arg)并结合指定的child_stack和flags参数来创建Sthread子线程;其中,fn参数是函数指针,表示Sthread子线程要执行的程序;arg参数是指针,表示传给Sthread子线程的参数;child_stack参数用来指定Sthread子线程的栈地址空间,所述栈地址空间从线程共享的堆空间中分配;flags参数不设置CLONE_VM标志,以确保新创建的子线程有独立的内存管理结构,保存从调用线程(父线程)的内存地址空间的副本,从而使得不同线程的地址空间操作(如mmap、munmap和pagefault等)的处理不再互相影响。
由于之前已经建立了数据共享机制,因此,所创建的Sthread子线程就能够实现子线程与其父线程之间各种数据的共享。
其中,对于堆数据共享机制而言,多线程间堆数据共享时堆数据空间采取静态划分策略,即假设共需N个Sthread子线程,则共享的堆数据的地址空间被分割为N个子堆;在创建Sthread子线程时,给每个Sthread子线程绑定一个独立的子堆;每个子堆仅用于响应所绑定Sthread子线程的分配请求;对于Sthread子线程的释放请求,则需要定位待释放内存所属的子堆,再交由所属子堆内存管理器进行回收;每个子堆上的内存管理器通过修改DougLea开发的dlmallocv2.8.6来实现。
3、在Halide运行时,使用所创建的Sthread子线程替换原有的Pthread重新实现Halide运行时系统中的halide_spawn_thread接口。
在Halide原有运行时实现中,par_for(即halide_do_par_for)调用halide_spawn_thread函数来创建工作线程并构建线程池;而halide_spawn_thread函数进一步调用Pthread(POSIX threads,POSIX线程)来创建工作线程。从而,整个线程池是基于Pthread的共享语义。因为Sthread保持与Pthread一致的共享语义,所以只需使用Sthread替换Pthread来重新实现halide_spawn_thread接口,就可以实现Sthread对par_for的支持,而不需要修改par_for函数的实现。
对于Halide运行时中的一组同步操作接口,如互斥量操作接口halide_mutex*和条件变量操作接口halide_cond*,是分别通过调用POSIX同步接口pthread_mutex*和pthread_cond*等来实现的,此时在互斥量和条件变量的初始化中需要设置共享对象的属性为PTHREAD_PROCESS_SHARED,表示共享对象是跨多个进程地址空间的,从而适配Sthread线程之间在多个地址空间上的同步。
为了说明本发明实施例上述方案的优点,还与传统方案进行了对比。
如图4所示,为不同测试程序的基于Sthread实现的Halide运行时系统(称为SHalide)版本与原生Halide版本相较串行基准版本的加速比曲线对比。如图4(a)和图4(b)两张图,可以发现各测试程序加速比的增长趋势是相似的,唯一不同之处在于Shalide的多核加速效果相较原生Halide有了明显的提升,大部分加速比值有2~4的增长。
图5进一步给出了每个测试程序的Shalide版本相对原生Halide版本在运行效率上的改进。图中y轴含义为THalide/TShalide-1(THalide和TShalide分别表示原生版本和Shalide版本的执行时间),y轴值越大则说明Shalide相对原生Halide的加速效果越好。在6个测试程序中,4个测试程序在各种逻辑核数配置下Shalide的加速效果均比Halide好。其中以lens_blur程序的加速效果最为明显,在32逻辑核环境下最大效率提升可达1.53倍。至于其他两个测试程序(即blur、camera_pipe),两者在16逻辑核环境下,camera_pipe在32逻辑核环境下,blur在64逻辑核环境下均出现负增长。尽管如此,在其他逻辑核数量配置下,两者仍旧取得了1.18倍~1.38倍的运行效率提升。
在测试程序bilateral_grid、lens_blur和local_laplacian上Shalide展示出非常好的加速比改进效果。原因有三:其一,缺页中断的数量由于内存分配器的实现策略有不同程度的下降,下降范围在-66%~-9%之间(表2的2-5列);其二,由于缺页中断引发的同步开销几乎被消除,同步开销仅占0.02%~0.07%的缺页中断处理时间;其三,内存分配器的内存预留策略避免了执行上下文的频繁切换,典型例子为bilateral_grid。
表2Shalide与Halide性能参数差异
下面以数据共享设置方式、全局数据(可读写数据区)共享机制以及栈数据共享机制为例进行具体的介绍。
1、数据共享设置方式。
如图6所示,分为5个阶段:
①初始化全局共享堆。
②设置全局数据区共享,主线程的栈迁移到通过调用mmap()创建的共享匿名内存映射(其中flags参数置为MAP_SHARED|MAP_ANON),其过程将在后文介绍栈数据共享机制时做详细介绍。
③通过clone接口创建Sthread子线程。
④为Sthread子线程绑定单独的共享子堆。
⑤主线程的栈从共享内存映射迁移回到原有私有内存映射。
2、全局数据(可读写数据区)共享。
如图7所示,全局数据(可读写数据区)共享采用2copy-2map方法实现,其中:
(a)请求匿名映射map1,将可读写数据段rwdata拷贝到map1。
(b)请求固定共享匿名映射map2覆盖原可读写数据段内存映射。
(c)将map1中暂存内容拷贝到map2中。
(d)注销内存映射map1。
在实际执行2copy-2map操作前,需要明确数据段内存映射区间的起始地址和大小,这部分信息可以通过操作系统提供的接口在程序运行时查询得知。以Linux系统为例,内核文件/proc/<PID>/maps存储PID进程全部的内存映射信息,每个内存映射信息作为其中一条记录,记录项目依次为内存映射起始和终止虚拟地址、内存访问权限、内存映射在被映射文件中偏移量、映射文件的主设备号和次设备号、设备节点号、映射文件名。程序通过getpid()系统调用获取自身进程号PID,读取并按格式解析/proc/<PID>/maps文件,即可获得所在进程的内存映射信息。
全局数据中的可读写数据段为私有文件映射,访问权限为rw-p(可读写、不可执行、进程私有),映射文件名为当前执行的可执行文件的绝对路径。通过读取/proc/<PID>/exe内核文件,可以获得PID进程所运行的可执行文件的绝对路径;再结合访问权限特征,即可唯一定位全局可读写数据段的内存映射记录。
全局数据共享的伪代码如下所示:
Pid=getpid();
MapStr=read(“/proc/”+str(Pid)+“/maps”);
Maps=parse(MapStr);
ExeStr=read(“/proc/”+str(Pid)+“/exe”);
Rwdata=Maps.find(ExeStr,“rw-p”);
Addr=Rwdata.begin;
Size=Rwdata.end–Rwdata.begin;
Map1=mmap(NULL,Size,MMAP_ANON);
memcopy(Map1,Addr,Size);
Map2=mmap(Addr,Size,MMAP_FIXED|MMAP_ANON|MMAP_SHARED);
memcopy(Map2,Map1,Size);
上述伪代码中,第一次mmap仅作内存暂存用途,不必指定映射起始位置和共享属性;第二次mmap覆盖原有私有可读写数据段映射,需要强制固定映射的起始位置与原映射起始位置相同、大小相同。
3、栈数据共享。
主线程的栈迁移是实现主线程栈数据共享的关键方法。如图8所示,该方法先请求共享匿名映射作为主线程启动后使用的共享栈空间,并将原私有栈内容拷贝到共享栈。共享栈大小与原有栈大小一致,在Linux系统中栈大小默认为8MB。栈内容拷贝需要明确原有栈地址范围,方法与全局数据共享相同,即通过读取并解析/proc/<PID>/maps可以查询私有栈地址范围,不再赘述。
栈的增长与消退由栈帧寄存器控制,基址寄存器bp指向栈顶栈帧上边界、栈帧寄存器sp指向栈顶栈帧下边界(默认栈空间向下增长)。图8中,bp'表示调用者的栈帧基址,ip'表示调用者中下条要执行的指令位置,栈帧寄存器原指向私有栈的栈顶栈帧F(图8(a)),F在共享栈中的拷贝为F',修改基址寄存器bp和栈帧寄存器sp使其指向F'(图8(b))。主线程栈迁移的具体步骤如如下伪代码所示:
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明披露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求书的保护范围为准。
Claims (6)
1.一种提升Halide语言在多核系统执行效率的线程模型Sthread实现方法,其特征在于,包括:
建立数据共享机制:在main函数运行之前,创建共享匿名映射来实现多线程间堆数据共享,同时,通过创建共享匿名映射并使用2copy-2map方法、栈迁移方法对应地实现全局数据共享、栈数据共享;其中,所述全局数据共享是指对可读写数据区的共享,所使用的共享匿名映射为固定共享匿名映射,全局数据共享通过使用2copy-2map方法实现,即先分配临时空间存储可读写数据区的副本,然后使用预先创建的固定共享匿名映射覆盖原有可读写数据区的内存映射,再将临时空间内的数据拷贝回原有地址空间;
在Linux下,调用函数clone来创建Sthread子线程,使得Sthread子线程能够按照所建立的数据共享机制实现子线程与其父线程之间各种数据的共享;
在Halide运行时,使用所创建的Sthread子线程替换原有的Pthread重新实现Halide运行时系统中的halide_spawn_thread接口。
2.根据权利要求1所述的一种提升Halide语言在多核系统执行效率的线程模型Sthread 实现方法,其特征在于,所述创建共享匿名映射来实现多线程间堆数据共享包括:
调用函数mmap(addr,length,prot,flags,fd,offset)创建共享匿名映射,flags参数置为MAP_ANON|MAP_SHARED,表示创建的地址空间映射区间为匿名映射和共享映射,fd与offset均置为0,addr和length参数分别表示地址空间映射区间的起始地址和长度,prot参数用于设置对所地址空间映射区间的访问模式;共享匿名映射使得线程在函数clone()后不受写时复制机制的影响,从而实现多线程间堆数据共享。
3.根据权利要求1所述的一种提升Halide语言在多核系统执行效率的线程模型Sthread 实现方法,其特征在于,所述栈数据共享是指对主线程栈数据的共享,其通过栈迁移方法实现,即在开始执行任务之前先将栈数据拷贝到预先创建的共享匿名映射,然后将当前硬件栈帧寄存器的值保存起来,再使之指向共享映射中的栈顶栈帧;待主线程的任务执行完成,将之前保存的栈帧寄存器的值恢复到栈帧寄存器中。
4.根据权利要求1所述的一种提升Halide语言在多核系统执行效率的线程模型Sthread 实现方法,其特征在于,所述调用函数clone来创建Sthread子线程包括:
通过调用函数clone(fn,child_stack,flags,arg)并结合指定的child_stack和flags参数来创建Sthread线程;其中,fn参数是函数指针,表示Sthread子线程要执行的程序;arg参数是指针,表示传给Sthread子线程的参数;child_stack参数用来指定Sthread子线程的栈地址空间,所述栈地址空间从线程共享的堆空间中分配;flags参数用来保存从调用线程的内存地址空间的副本。
5.根据权利要求1或2或4所述的一种提升Halide语言在多核系统执行效率的线程模型Sthread 实现方法,其特征在于,多线程间堆数据共享时堆数据空间采取静态划分策略,即假设共需N个Sthread子线程,则共享的堆数据的地址空间被分割为N个子堆;在创建Sthread子线程时,给每个Sthread子线程绑定一个独立的子堆;
每个子堆仅用于响应所绑定Sthread子线程的分配请求;对于Sthread子线程的释放请求,则需要定位待释放内存所属的子堆,再交由所属子堆内存管理器进行回收;每个子堆上的内存管理器通过修改DougLea开发的dlmallocv2.8.6来实现。
6.根据权利要求1所述的一种提升Halide语言在多核系统执行效率的线程模型Sthread 实现方法,其特征在于,
在Halide运行时同步操作接口halide_{mutex/cond}*,通过调用pthread_{mutex/cond}*函数来实现,此时在互斥量和条件变量的初始化中需要指定PTHREAD_PROCESS_SHARED以适配Sthread线程的多地址空间上的同步;
对于Halide运行时的一组同步操作接口包括:互斥量操作接口halide_mutex*及条件变量操作接口halide_cond*,分别通过调用POSIX同步接口pthread_mutex*和pthread_cond*来实现;此时在互斥量和条件变量的初始化中需要设置共享对象的属性为PTHREAD_PROCESS_SHARED,表示共享对象是跨多个进程地址空间的,从而适配Sthread子线程之间在多个地址空间上的同步。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811145982.8A CN109376022B (zh) | 2018-09-29 | 2018-09-29 | 一种提升Halide语言在多核系统执行效率的线程模型实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811145982.8A CN109376022B (zh) | 2018-09-29 | 2018-09-29 | 一种提升Halide语言在多核系统执行效率的线程模型实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109376022A CN109376022A (zh) | 2019-02-22 |
CN109376022B true CN109376022B (zh) | 2021-12-14 |
Family
ID=65403126
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811145982.8A Active CN109376022B (zh) | 2018-09-29 | 2018-09-29 | 一种提升Halide语言在多核系统执行效率的线程模型实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109376022B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113485835B (zh) * | 2021-07-14 | 2022-04-22 | 深圳大趋智能科技有限公司 | 一种多场景下共享内存的实现方法、系统、设备及介质 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103870767A (zh) * | 2014-03-19 | 2014-06-18 | 四川大学 | 基于ebp构造的栈栈帧内容保护方法 |
US9152474B2 (en) * | 2014-01-20 | 2015-10-06 | Netapp, Inc. | Context aware synchronization using context and input parameter objects associated with a mutual exclusion lock |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102253855B (zh) * | 2011-06-17 | 2016-04-13 | 天津书生软件技术有限公司 | 一种传递共享内存的方法和装置 |
CN103246616B (zh) * | 2013-05-24 | 2017-09-26 | 浪潮电子信息产业股份有限公司 | 一种长短周期访问频度的全局共享缓存替换方法 |
CN104461706B (zh) * | 2014-11-24 | 2019-03-26 | 上海华为技术有限公司 | 一种将共享全局变量共享的方法和多处理装置 |
-
2018
- 2018-09-29 CN CN201811145982.8A patent/CN109376022B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9152474B2 (en) * | 2014-01-20 | 2015-10-06 | Netapp, Inc. | Context aware synchronization using context and input parameter objects associated with a mutual exclusion lock |
CN103870767A (zh) * | 2014-03-19 | 2014-06-18 | 四川大学 | 基于ebp构造的栈栈帧内容保护方法 |
Non-Patent Citations (3)
Title |
---|
Optimizing message-passing on multicore architectures using hardware multi-threading;D.Buono;《2014 22nd Euromicro International Conference on Parallel, Distributed, and Network-Based Processing》;20140414;全文 * |
多核下可伸缩的多线程模型;陈健康;《中国优秀硕士学位论文全文数据库信息科技辑》;20180115;第2018年卷(第1期);第13-34页 * |
陈健康.多核下可伸缩的多线程模型.《中国优秀硕士学位论文全文数据库信息科技辑》.2018,第2018年卷(第1期), * |
Also Published As
Publication number | Publication date |
---|---|
CN109376022A (zh) | 2019-02-22 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7996629B2 (en) | Multiprocessor computing system with multi-mode memory consistency protection | |
US7895407B2 (en) | Memory consistency protection in a multiprocessor computing system | |
US5812852A (en) | Software implemented method for thread-privatizing user-specified global storage objects in parallel computer programs via program transformation | |
US20060026183A1 (en) | Method and system provide concurrent access to a software object | |
US6219783B1 (en) | Method and apparatus for executing a flush RS instruction to synchronize a register stack with instructions executed by a processor | |
EP1600857B1 (en) | Thread rendezvous for read-only code in an object-oriented computing enviroment | |
US20160026488A1 (en) | Instruction set emulation for guest operating systems | |
US8185895B2 (en) | Method, apparatus and program storage device for providing an anchor pointer in an operating system context structure for improving the efficiency of accessing thread specific data | |
Lee et al. | Using memory mapping to support cactus stacks in work-stealing runtime systems | |
Boyd-Wickizer et al. | Reinventing scheduling for multicore systems. | |
US11620215B2 (en) | Multi-threaded pause-less replicating garbage collection | |
US6115777A (en) | LOADRS instruction and asynchronous context switch | |
JP7304119B2 (ja) | ポーズレスなガベージ・コレクションのための活性化フレームを表す方法および装置 | |
US7769962B2 (en) | System and method for thread creation and memory management in an object-oriented programming environment | |
US20060037003A1 (en) | System and method for providing exceptional flow control in protected code through memory layers | |
CN111813710B (zh) | 避免Linux内核内存碎片方法、设备及计算机存储介质 | |
Theobald et al. | Overview of the Threaded-C language | |
US11249853B2 (en) | System and method for creating a snapshot of a subset of a database | |
CN109376022B (zh) | 一种提升Halide语言在多核系统执行效率的线程模型实现方法 | |
Jung et al. | Overlapping host-to-device copy and computation using hidden unified memory | |
KR20230121884A (ko) | 어드레스 매핑 인식 태스킹 메커니즘 | |
US20070143436A1 (en) | Method, apparatus and program storage device for providing light weight system calls to improve user mode performance | |
Hagen et al. | PGASUS: a framework for C++ application development on NUMA architectures | |
US6240500B1 (en) | Method for dynamically placing procedures of a program in a memory | |
US11960420B2 (en) | Direct memory control operations on memory data structures |
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 |