本发明的实施例总体上涉及人工智能领域,更具体地涉及一种用于在线程束内生成线程随机发射的方法、计算装置、计算机可读存储介质和计算机程序产品。
背景技术:
1、单指令多线程 (single instruction multi thread,simt)是 gpu 编程的一种常见指令。例如,以由32 个线程组成的一个线程束 (warp)为例,该线程束共享一个程序计数器(pc)。每条指令会由 32 个线程与携带着各自数据的 32 个线程本地寄存器(threadlocal register,tlr)一并执行。图形处理器(graphics processing unit,gpu)提供了一个掩码 (mask) 寄存器来控制每个线程是否需要执行。该掩码寄存器是一个32位的线程束标量寄存器(warp scalar register,wsr),其中每个比特位对应一个线程的活跃状态(例如,寄存器对应位为 “1”时,表示对应线程活跃,会执行对应指令;寄存器对应位为 “0”时,则代表对应线程不活跃,不执行对应指令)。
2、应当理解,在待执行的中间表示(“intermediate representation”,或称“intermediate code”,即,“中间代码”。应当理解,中间表示是编译器在生成目标代码之前的中间数据结构)及其基本块中通常存在线程分支的指令。在传统的用于支持线程分支的方法中,通常会采用所有线程都共享的互斥锁(mutual exclusion ,mutex)。应当理解,互斥锁(其也称为“线程锁”)是一种用于多线程编程中的,防止两条线程同时对同一公共资源(比如全局变量)进行读写的机制。在面临循环指令时,上述采用所有线程都共享的互斥锁的方式容易导致线程死锁的问题。所谓“线程死锁”是指两个或两个以上的线程在执行过程中,由于竞争资源而造成的一种阻塞的现象。如果多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放。上述阻塞可能导致程序无法正常终止。在传统的用于避免线程死锁的程序解决方案中,通过使得每个 线程束只有一个线程去争夺资源,而之后在线程束中分离线程执行单线程部分,由此保证每个线程束只会有一个线程进入获取资源的循环。但是,由于互斥锁的模式非常多,因此,传统的用于避免线程死锁的程序解决方案无法在编译器完成自动变换。
3、综上,传统的方法存在的不足之处在于:难以在实现通过程序解决方案避免线程死锁的同时,使得程序解决方案可以在编译器完成自动变换。
技术实现思路
1、本发明提供了一种用于在线程束内生成线程随机发射的方法、计算装置、计算机可读存储介质和计算机程序产品,不仅能够通过程序解决方案避免线程死锁,而且可以在编译器完成自动变换。
2、根据本发明的第一方面,提供了一种用于在线程束内生成线程随机发射的方法。该方法包括:在线程束内配置线程本地寄存器,以用于维护线程束中的每个线程后继期望执行的程序计数器,所述线程束共享一个程序计数器;响应于确定程序基本块执行完成,选择一个活跃线程作为代表线程;以及以代表线程的后继期望执行的程序计数器作为线程束的后续期望执行的程序计数器。
3、在一些实施例中,用于在线程束内生成线程随机发射的方法还包括:经由编译器后端,确定函数内的程序基本块是否包含需要进行线程束内同步的指令;响应于确定函数内的程序基本块包含需要进行线程束内同步的指令,将第一前序指令序列插入至待执行程序基本块的开头之处,以用于通过第一前序指令序列完成线程束内线程之间的同步。
4、在一些实施例中,用于在线程束内生成线程随机发射的方法还包括:响应于确定函数内的程序基本块不包含需要进行线程束内同步的指令,将第二前序指令序列插入至待执行程序基本块的开头之处。
5、在一些实施例中,用于在线程束内生成线程随机发射的方法还包括:生成结尾指令序列,以用于在程序基本块的原有指令执行完之后并且执行跳转指令之前,执行所生成的结尾指令序列。
6、在一些实施例中,用于在线程束内生成线程随机发射的方法还包括:计算跳转条件;基于跳转条件被满足与否的状态,使用第一跳转目标程序基本块的程序计数器标识或者第二跳转目标程序基本块的程序计数器标识更新每个线程后续期望执行的程序计数器;使用当前代表线程的后续期望执行的程序计数器作为线程束的后续期望执行的程序计数器;选择下一个活跃线程以作为代表线程;以及跳转到线程束的后续期望执行的程序计数器,以开始执行后续指令。
7、在一些实施例中,针对程序基本块的生成第二前序指令序列包括:确定当前线程的程序计数器是否与待执行程序基本块的起始程序计数器相同;响应于确定当前线程的程序计数器与待执行程序基本块的起始程序计数器相同,更新掩码;以及执行待执行程序基本块内的指令。
8、在一些实施例中,针对程序基本块的生成第一前序指令序列包括:确定是否存在后续期望执行的程序计数器小于需要同步的程序基本块的程序计数器的线程;响应于确定存在线程的后续期望执行的程序计数器小于需要同步的程序基本块的程序计数器,执行管理指令;响应于确定不存在后续期望执行的程序计数器小于需要同步的程序基本块的程序计数器的线程,根据线程的后续期望执行的程序计数器与需要同步的程序基本块的起始程序计数器是否相同的状态,更新掩码;以及执行需要同步的程序基本块的原有指令。
9、在一些实施例中,执行管理指令包括:筛选后续期望执行的程序计数器小于需要同步的程序基本块的程序计数器的线程,以便更新掩码;基于更新后的掩码,选择代表线程;使用代表线程的后续期望执行的程序计数器作为线程束的后续的程序计数器;以及跳转到线程束的后续期望执行的程序计数器,以开始执行后续指令。
10、在一些实施例中,选择一个活跃线程作为代表线程包括:轮询调度的方式,在当前区域中的活跃线程中选择一个活跃线程作为代表线程。
11、在一些实施例中,在线程束内配置线程本地寄存器,以用于维护线程束中的每个线程后继期望执行的程序计数器包括:经由编译器前端和中端,确认中间表示中是否存在互斥锁的模式;以及响应于确认中间表示中存在互斥锁的模式,在线程束内配置线程本地寄存器,以用于维护线程束中的每个线程后继期望执行的程序计数器。
12、根据本发明的第二方面,还提供了一种计算装置。该计算装置包括:至少一个处理器;以及与至少一个处理器通信连接的存储器;其中存储器存储有可被至少一个处理器执行的指令,指令被至少一个处理器执行,以使计算装置能够执行本发明的第一方面的方法。
13、根据本发明的第三方面,还提供了一种计算机可读存储介质。该计算机可读存储介质上存储有计算机程序,计算机程序被机器执行时执行本发明的第一方面的方法。
14、根据本发明的第四方面,还提供了一种计算机程序产品,包括计算机程序,计算机程序被机器执行时执行本发明的第一方面的方法。
15、本发明的有益效果在于:不仅能够通过程序解决方案避免线程死锁,而且由于线程束的后续期望执行的程序计数器为所选择的活跃的代表线程的后继期望执行的程序计数器,不会受到互斥锁的模式的影响,因此,可以在编译器完成自动变换。
16、应当理解,本部分所描述的内容并非旨在标识本发明的实施例的关键或重要特征,也不用于限制本发明的范围。本发明的其它特征将通过以下的说明书而变得容易理解。
1.一种用于在线程束内生成线程随机发射的方法,其特征在于,包括:
2.根据权利要求1所述的方法,其特征在于,还包括:
3.根据权利要求2所述的方法,其特征在于,还包括:
4.根据权利要求1所述的方法,其特征在于,还包括:
5.根据权利要求4所述的方法,其特征在于,生成结尾指令序列包括:
6.根据权利要求3所述的方法,其特征在于,针对程序基本块的生成第二前序指令序列包括:
7.根据权利要求2所述的方法,其特征在于,针对程序基本块的生成第一前序指令序列包括:
8.根据权利要求7所述的方法,其特征在于,执行管理指令包括:
9.根据权利要求1所述的方法,其特征在于,选择一个活跃线程作为代表线程包括:
10. 根据权利要求1所述的方法,其特征在于,在线程束内配置线程本地寄存器,以用于维护线程束中的每个线程后继期望执行的程序计数器包括:
11.一种计算装置,其特征在于,包括:
12.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被机器执行时执行根据权利要求1-10中任一项所述的方法。
13.一种计算机程序产品,其特征在于,包括计算机程序,所述计算机程序被机器执行时执行根据权利要求1-10中任一项所述的方法。