CN108073525A - 预取数据的方法、装置和系统 - Google Patents

预取数据的方法、装置和系统 Download PDF

Info

Publication number
CN108073525A
CN108073525A CN201610979946.6A CN201610979946A CN108073525A CN 108073525 A CN108073525 A CN 108073525A CN 201610979946 A CN201610979946 A CN 201610979946A CN 108073525 A CN108073525 A CN 108073525A
Authority
CN
China
Prior art keywords
function
variable
global variable
initial address
structure member
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.)
Granted
Application number
CN201610979946.6A
Other languages
English (en)
Other versions
CN108073525B (zh
Inventor
周巍
喻钢
毕波
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Huawei Technologies Co Ltd
Original Assignee
Huawei Technologies Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Priority to CN201610979946.6A priority Critical patent/CN108073525B/zh
Application filed by Huawei Technologies Co Ltd filed Critical Huawei Technologies Co Ltd
Priority to CA3043127A priority patent/CA3043127C/en
Priority to EP17869063.2A priority patent/EP3534266B1/en
Priority to JP2019524061A priority patent/JP6830534B2/ja
Priority to RU2019117778A priority patent/RU2019117778A/ru
Priority to KR1020197015445A priority patent/KR102353213B1/ko
Priority to PCT/CN2017/109536 priority patent/WO2018086494A1/zh
Publication of CN108073525A publication Critical patent/CN108073525A/zh
Priority to US16/405,869 priority patent/US20190266094A1/en
Application granted granted Critical
Publication of CN108073525B publication Critical patent/CN108073525B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0862Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches with prefetch
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • G06F8/4442Reducing the number of cache misses; Data prefetching
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30047Prefetch instructions; cache control instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/60Details of cache memory
    • G06F2212/602Details relating to cache prefetching
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2212/00Indexing scheme relating to accessing, addressing or allocation within memory systems or architectures
    • G06F2212/60Details of cache memory
    • G06F2212/6028Prefetching based on hints or prefetch instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3802Instruction prefetching
    • YGENERAL 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
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE 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/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Memory System Of A Hierarchy Structure (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明实施例公开了一种预取数据的方法和装置,应用于计算机系统,所述计算机系统包括预取引擎、内存以及编译器,所述方法包括:所述编译器在编译过程中执行:获取N个函数和所述N个函数的第一全局变量,所述N为大于或等于1的整数;确定所述N个函数的起始地址和所述第一全局变量的起始地址,以便于预取引擎能够根据所述N个函数的起始地址和所述第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中,可以提高预取数据的灵活性。

Description

预取数据的方法、装置和系统
技术领域
本发明实施例涉及计算机领域,特别涉及计算机领域中的预取数据的方法、装置和系统。
背景技术
随着微处理器技术的高速发展,中央处理单元(Central Processing Unit,简称“CPU”)主频的提高,核数的增多,CPU的性能得到了显著提高,但是计算机整体性能的提升却有限,其主要的原因是CPU到存储器中取数据带来的时延,为了解决CPU在存储器中取数据带来的时延,在CPU与存储器之间增加高速缓存(Cache),通过将CPU频繁使用的数据预取到Cache中,当CPU要访问内存中的数据时,首先查询Cache中是否有CPU需要访问的数据以及需要访问的数据是否过期,如果需要访问的数据在Cache中且未过期则从Cache中读出数据,若CPU访问的数据在Cache中则称为命中,若CPU访问的数据不在Cache中则称为不命中。
现有技术通过在函数内插入软件prefetch指令,当程序运行到该prefetch指令时,根据该预取指令将内存中的数据预取到Cache中,prefetch指令的使用范围通常只限制在函数范围内,该prefetch指令预取数据的时机由程序开发人员指定,预取数据的时机受到了一定的限制。
发明内容
本发明实施例提供的预取数据的方法、装置和系统,提高了预取的数据的灵活性。
第一方面,提供了一种预取数据的方法,该方法包括:获取N个函数和所述N个函数的第一全局变量,所述N为大于或等于1的整数。确定所述N个函数的起始地址和所述第一全局变量的起始地址,以便于预取引擎能够根据所述N个函数的起始地址和所述第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中。
在某些实现方式中,上述方法应用于计算机系统,所述计算机系统包括预取引擎、内存以及编译器,编译器可以执行上述方法,具体地,编译器可以在编译过程中执行上述方法。
在某些实现方式中,所述N个函数的起始地址可以是N个函数共用的一个起始地址,所述N个函数的起始地址可以为预取内存中的数据到缓存中的预取时机,该预取时机可以是N个函数中其中一个函数的起始地址,通常情况下,该预取时机可以为N个函数中编译器解析出地址最前面的函数的起始地址,当然也可以是处于特定位置的函数的起始地址。当预取引擎读到该N个函数的起始地址时,该N个函数的起始地址用于触发该预取引擎预取所述内存中与第一全局变量的关联数据到缓存中。
在某些实现方式中,第一全局变量的起始地址可以是编译器解析出来的第一全局变量的起始地址,该编译器解析出来的第一全局变量的起始地址可以与内存中存储该第一全局变量的关联数据的起始地址存在有地址映射关系,当预取引擎获取到编译器解析出来的第一全局变量的起始地址时,根据地址映射关系和第一全局变量的起始地址确定内存中存储该第一全局变量的关联数据的起始地址,进一步地,预取引擎根据内存中存储该第一全局变量的关联数据的起始地址预取内存中的第一全局变量的数据到缓存中。第一全局变量的起始地址也可以是编译器直接编译出来的内存中该第一全局变量的关联数据的起始地址。
在本发明实施例中,编译器首先获取N个函数和N个函数的第一全局变量,然后确定N个函数的起始地址以及第一全局变量的起始地址,预取引擎根据N个函数的起始地址和第一全局变量的起始地址预取内存中的第一全局变量的关联数据到Cache中,N个函数的起始地址可以理解为预取数据的预取时机,预取引擎与编译器可以并行执行,预取时机为N个函数的起始地址而不不依赖于现有技术的软件预取指令,提高了预取的灵活性。
在某些实现方式中,预取引擎读取到N个函数的起始地址时,或者读取到N个函数的起始地址之后的第二时间段后,或者在读N个函数的起始地址之前的第一时间段,预取引擎根据该第一全局变量的起始地址将内存中与第一全局变量关联的数据预取到Cache中,可以根据N个函数的起始地址灵活的确定预取时机。
在某些实现方式中,编译器可以通过两种方式确定N个函数的起始地址,第一种方式是编译器解析到N个函数时,解析该N个函数的起始地址;第二种方式是编译器在开始编译的阶段就将所有函数的起始地址都解析出来,当编译器解析到该N个函数时,查找之前解析出来的起始地址确定该N个函数的起始地址,这样,可以节省程序运行的时间。同样地,编译器可以通过两种方式确定第一全局变量的起始地址,第一种方式是编译器解析到第一全局变量时,解析该第一全局变量的起始地址;第二种方式是编译器在开始编译的阶段就将所有的全局变量的起始地址都解析出来,当编译器解析到第一全局变量时,查找之前解析出来的的全局变量的起始地址确定该第一全局变量的起始地址。
当N等于1时,即一个函数对应一个起始地址,这样,编译器预取的是该函数的第一全局变量的关联数据。
当N大于1时,即多个函数可以共用一个起始地址,即预取引擎不仅可以将内存中一个函数的第一全局变量对应的数据预取到Cache中,也可以将内存中多个函数的第一全局变量对应的数据预取到Cache中。可选地,该多个函数可以是与特定业务相关的多个函数,例如为了实现某项特殊的业务,该项业务需要用到该多个函数,这样,可以通过一个起始地址就可以将内存中多个函数的第一全局变量的对应的数据预取的到Cache中,进一步提高了预取数据的效率。
在某些实现方式中,编译器可以直接将确定的N个函数的起始地址和第一全局变量的起始地址发送给预取引擎,以备预取引擎预取内存中的数据到缓存中。进一步地,编译器可以将N个函数的起始地址和第一全局变量的起始地址以文本的形式保存或者以二进制工具的形式保存,以备预取引擎读取;可选地,编译器可以将N个函数的起始地址、第一全局变量的起始地址以及预取时机的标识信息以文本的形式或者以二进制的形式保存,以备预取引擎读取,例如,预取时机的标识信息可以是第一标识、第二标识或第三标识,第一标识用于标识预取引擎在读到N个函数的起始地址时预取第一全局变量的关联数据到Cache中;第二标识用于标识预取引擎读到N个函数的起始地址的第一时间段内之前,预取第一全局变量的关联数据到Cache中;第三标识用于标识预取引擎读到N个函数的起始地址的第二时间段之后,预取第一全局变量的关联数据到Cache中。
在某些实现方式中,N个函数和N个函数的第一全局变量可以同时获取,也可以分别获取。
在某些实现方式中,所述第一全局变量包括M个结构体成员变量,所述M为大于或等于1的整数。
这样,可以避免现有技术通过在函数中插入预取指令预取M个结构体成员变量的关联数据,并且现有技术预取M个结构体成员变量的关联数据需要M个预取指令才能预取到内存中与该M个结构体成员变量关联的数据,这样会增加程序运行的时间,并且M个结构体成员变量预取的时机仅通过程序员指定,很难保证编译器编译调度的时间与程序员指定的M个结构体成员变量的预取时机的协调,并不能保证Cache的命中率,例如,当M个结构体成员变量的预取指令插入太早,数据过早预取到Cache中时,可能CPU还没有访问Cache,数据就被替换掉,当M个结构体成员变量的预取指令插入过晚,CPU访问Cache时,会造成延时。
在某些实现方式中,所述确定所述N个函数的起始地址和所述第一全局变量的起始地址,以便于所述预取引擎根据所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到缓存Cache中,包括:解析所述N个函数使用的至少一个结构体成员变量,所述M个结构体成员变量包括所述至少一个结构体成员变量;确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量,以便于所述预取引擎根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量,预取所述内存中所述至少一个结构体成员变量的关联数据到所述缓存中。
这样,可以根据实际的N个函数的需求解析出N个函数用到的结构体成员变量,预取引擎预取N个函数用到的结构体成员变量关联的数据,而不是盲目的将第一全局变量的全部的M个结构体成员变量的关联数据都预取到Cache中,可以提高预取的效率,进一步能够提高Cache的命中率。
在某些实现方式中,所述确定所述N个函数的起始地址和所述第一全局变量的起始地址,以便于所述预取引擎根据所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到缓存Cache中,包括:解析所述N个函数使用的至少一个结构体成员变量,所述M个结构体成员变量包括所述至少一个结构体成员变量。确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量。根据所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量,确定所述至少一个结构体成员变量中每个结构体成员变量在所述内存中的缓存行Cache line的索引号,以便于所述预取引擎根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述每个结构体成员变量在所述内存中的所述Cache line索引号预取所述内存中的数据。
在本发明实施例中,编译器还可以将每个结构体成员变量的地址偏移量映射为Cache line的索引号,编译器将N个函数的起始地址、第一全局变量的起始地址和Cacheline索引号保存在文本中或二进制工具中,预取引擎根据N个函数的起始地址、第一全局变量的起始地址和Cache line索引号预取内存中的与至少一个结构体成员变量关联的数据预取到缓存中。
在某些实现方式中,在所述确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量之前,所述方法还包括:编译器解析所述M个结构体成员变量得到所述M个结构体成员变量中每个结构体成员变量相对于所述第一全局变量的起始地址的地址偏移量。其中,确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量,包括:在所述M个结构体成员变量中每个结构体成员变量相对于所述第一全局变量的起始地址的地址偏移量中,确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量。
在本发明实施例中,编译器可以提前解析M个结构体成员变量中每个结构体成员变量相对于第一全局变量的起始地址的地址偏移量,当编译器解析到N个函数只用到M个结构体成员变量中的至少一个结构体成员变量时,可以在M个结构体成员变量中每个结构体成员变量的地址偏移量中查找至少一个结构体成员变量的地址偏移量。当然,编译器也可以在解析N个函数用到的至少一个结构体成员变量时,再解析至少一个结构体成员变量相对于第一全局变量的地址偏移量。
在某些实现方式中,在所述获取N个函数和所述N个函数的第一全局变量之前,所述编译器在编译过程中执行:获取P个函数和所述P个函数中每个函数的至少一个全局变量,所述P个函数包括所述N个函数,P大于或等于1,P为大于或等于N的整数;解析所述P个函数中每个函数的起始地址;解析所述P个函数中每个函数的至少一个全局变量中每个全局变量的起始地址;其中,获取所述N个函数和所述N个函数的第一全局变量,包括:在所述P个函数中确定所述N个函数;在所述N个函数的至少一个全局变量中确定所述第一全局变量;确定所述N个函数的起始地址,包括:在所述P个函数中每个函数的起始地址中确定所述N个函数的起始地址;所述确定所述第一全局变量的起始地址,包括:在所述每个全局变量的起始地址中确定所述第一全局变量的起始地址。
在本发明实施例中,整个程序运行过程中可以包括P个函数,P个函数中的每个函数包括至少一个全局变量,编译器解析P个函数中每个函数的起始地址,在解析到的每个函数的起始地址中确定N个函数的起始地址;编译器还需要解析该P个函数的至少一个全局变量中每个全局变量的N个函数的起始地址,在每个全局变量的起始地址中匹配得到N个函数的第一全局变量的起始地址,在编译器初级编译阶段就可以将P个函数以及P个函数中每个函数对应的至少一个全局变量的起始地址都解析出来,形成映射表,当编译器解析到N个函数时,解析N个函数用到的第一全局变量时,在映射表中查找第一全局变量的起始地址。
在某些实现方式中,所述获取N个函数和所述N个函数的第一全局变量,包括:
所述编译器在编译过程中,接收编译指示信息,并根据所述编译指示信息获取所述N个函数和所述N个函数的第一全局变量,其中,所述编译指示信息用于指示N个函数和所述N个函数的所述第一全局变量,和/或所述编译指示信息用于指示所述N个函数和所述N个函数不使用的全局变量。
当编译指示信息指示的是所述N个函数和所述N个函数的第一全局变量时,编译器解析的是N个函数以及N个函数的第一全局变量;当编译指示信息指示的是所述N个函数和所述N个函数不使用的全局变量,编译器解析的是N个函数以及N个函数除了不使用的全局变量外的其他全局变量;当编译指示信息即指示N个函数,又指示N个函数的第一全局变量和N个函数不使用的全局变量时,编译器解析的是N个函数的第一全局变量。也即,编译指示信息既可以指示N个函数关注的第一全局变量,也可以知心N个函数不关注的全局变量,具体地,用户可以对N个函数关注的第一全局变量和N个函数不关注的全局变量进行配置。
可选地,该编译指示信息也可以指示P个函数中和P个函数中的每个函数使用的全局变量,和/或编译指示信息也可以指示P个函数和P个函数中的每个函数不使用的全局变量。
可替换地,编译指示信息除了可以函数与全局变量的对应关系外,还可以指示函数与结构体成员变量的对应关系,如,可以指示N个函数使用哪些结构体成员变量,不使用哪些结构体成员变量,这样,在编译器解析的过程中就只解析函数使用的结构体成员变量相对于全局变量的地址偏移量等。
可选地,该编译指示信息可以以命令行的形式插入到函数头前。例如,将编译指示信息插入到函数头前面,用于指示编译器需要分析的函数以及函数的全局变量,编译指示信息可以指示一个函数和一个函数的全局变量,也可以指示多个函数共同的全局变量,具体用户可以配置编译指示信息指示的是一个函数还是多个函数,当用户配置编译指示信息指示的是一个函数时,则一个函数对应一个起始地址,当用户配置编译指示信息指示的是多个函数时,则多个函数对应一个起始地址。
此外,编译指示信息也可以指示函数与全局变量或结构体成员变量的对应关系,例如,一个函数配置一个或多个全局变量,或者一个函数配置一个或多个结构体成员变量,或者一个全局变量配置一个或多个结构体成员变量,编译器根据对应关系解析函数以及函数对应的全局变量或者结构体成员变量。可选地,编译指示信息可以是用户确定的。
在某些实现方式中,所述获取N个函数和所述N个函数的第一全局变量,包括:
所述编译器在编译过程中,从文本文件中读取第一对应关系和/或第二对应关系,并根据所述第一对应关系和/或所述第二对应关系获取所述N个函数和所述N个函数的第一全局变量,其中,所述第一对应关系用于指示所述N个函数和所述N个函数的所述第一全局变量,和/或,所述第二对应关系用于指示所述N个函数和所述N个函数不使用的全局变量。
在本发明实施例中,多个函数以及需要分析的多个函数的全局变量可以以列表的形式存储在文本文件中,一个函数需要分析的或不需要分析的全局变量之间可以用对应关系表示,N个函数需要分析的第一全局变量用第一关系表示,N个函数不需要分析的变量用第二对应关系表示。当编译器解析到N个函数时,根据第一对应关系和/或第二对应关系在文本文件的列表中查找这N个函数的第一全局变量。当然,编译器可以将列表中的多个函数与多个函数对应的全局变量的起始地址提前可以解析出来,在执行到N个函数时,在提前解析出来的起始地址中查找该N个函数的起始地址,这样可以实现集中管理,减少操作的复杂性。
可选地,函数与全局变量对应关系,全局变量与结构体成员变量的对应关系也可以列表的形式存储在文本文件中,即N个函数的第一全局变量,N个函数用到的第一全局变量中的结构体成员变量都可以提前以列表的形式在文本文件中存储,当编译器解析到该N个函数时,从文本文件中读取来获得N个函数、N个函数的第一全局变量和第一全局变量中N个函数用到的结构体成员变量。
具体地,第一对应关系可以是函数用到的全局变量组成的列表,例如,第一个函数中用到全局变量a,第二个函数用到全局变量a,将第一个函数和第二个函数用到的变量以列表的形式保存起来,预取引擎需要将内存中与第一函数和第二函数用到的全局变量a的关联数据预取到Cache中,例如a可以为前述的第一全局变量,编译器通过查找列表的方式找到第一个函数和第二个函数,以及两个函数的全局变量a。类似地,第二对应关系也可以是函数没有使用到的全局变量组成的列表。这样,可以实现集中管理,减少操作的复杂性。
在某些实现方式中,在所述确定所述第一全局变量的起始地址之后,所述方法还包括:所述编译器将所述N个函数的起始地址和所述第一全局变量的起始地址输出到文本文件或二进制工具中,以便于所述预取引擎读取所述文本文件或所述二进制工具中的所述N个函数的起始地址和所述第一全局变量的起始地址;所述预取引擎根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述缓存中。
编译器将N个函数的起始地址和第一全局变量的起始地址保存在文本文件或二进制工具中,预取引擎从文本文件和二进制工具中读取N个函数的起始地址和第一全局变量的起始地址,并根据该N个函数的起始地址确定预取数据的时机,再确定的预取时机预取内存中第一全局变量的起始地址对应的数据;当然,也可以将Cache line的索引号,或者结构体成员变量的地址偏移量等有关于预取的信息的保存在文本文件中或者二进制工具中,以备预取引擎根据文本文件或二进制工具中的预取信息区域内存中的数据。
在某些实现方式中,所述预取引擎根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述Cache,包括:所述预取引擎读到所述N个函数的起始地址时,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述Cache中;或所述预取引擎读到所述N个函数的起始地址的第一时间段之前,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述Cache中;或所述预取引擎读到所述N个函数的起始地址的第二时间段之后,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述Cache中。
预取可以是预取引擎在读到第一全局变量的起始地址时进行预取,或者在读到第一全局变量的起始地址前的第一时间段,或者在读到第一全局变量的起始地址后的第二时间段,预取内存中的第一全局变量的关联数据到Cache中,进一步提高了数据预取的灵活性。
在某些实现方式中,获取所述N个函数的第一全局变量,包括:解析所述N个函数的分区,所述分区包括热分区和冷分区;在所述热分区中获取所述第一全局变量。
在本发明实施例中,编译器可以解析N个函数的分区,N个函数的分区包括热分区和冷分区,编译器可以将冷分区筛选掉,获取热分区中的第一全局变量,这样可以提高预取数据的效率,只需要预取经常使用的函数的分区中的全局变量对应的数据到Cache中,进一步可以提高预取数据的效率。
可选地,热分区用于表示N个函数的分区被访问的次数频繁,冷分区用于表示N个函数的分区被访问的次数较少。例如,在特定时间段内,该N个函数的第一分区被访问的次数超过预设阈值时,则认为第一分区是热分区。在特定的时间段内,该N个函数的第二分区被访问的次数小于预设阈值,则认为第二分区是冷分区。
在某些实现方式中,在获取所述N个函数的第一全局变量之后,所述编译器在编译的过程中执行:获取所述N个函数的第二全局变量;确定所述第一全局变量与所述第二全局变量的访问先后顺序,以便于所述预取引擎根据访问先后顺序预取所述内存中第一全局变量关联数据到所述Cache。
在本发明实施例中,编译器不仅可以解析到N个函数的第一全局变量和第二全局变量,编译器也可以结合编译的控制信息流,解析到第一全局变量和第二全局变量在程序运行过程中的先后顺序,预取引擎可以根据先后顺序预取第一全局变量关联的数据到Cache中,若第一全局变量的访问顺序在第二全局变量之前,则预取引擎先预取第一全局变量关联数据到Cache中;若第一全局变量的访问顺序在第二全局变量的访问顺序之后,则预取引擎先预取第二全局变量的关联数据到Cache中,再预取第一全局变量的关联数据到Cache中,这样,Cache先存入的数据是先被CPU访问,可以提高预取的效率,进一步提高Cache的存储效率,也可以提高Cache的命中率。
在某些实现方式中,所述编译器在编译的过程中执行:获取所述N个函数的第三全局变量;确定所述第一全局变量和所述第三全局变量在所述内存中的缓存行Cache line的索引号,以便于所述预取引擎根据所述Cache line索引号预取所述内存中的所述的第一全局变量和所述第三全局变量的关联数据到所述Cache中。
若两个全局变量同属于一个Cache line索引号,则只要一个Cache line就可以预取到两个全局变量的关联数据,而现有技术即使两个全局变量同属于一个Cache line索引号,也需要两个Cache line才能预取到两个全局变量的数据,这样,进一步可以节省预取的次数,提高预取的效率。
在某些实现方式中,所述N个函数为热点函数,所述第一全局变量为热点全局变量。
在本发明实施例中,热点函数用于表示频繁使用的函数,例如,在特定时间段内,该N个函数被调用的次数超过第一阈值时,则认为该N个函数是热点函数。该热点全局变量用于表示频繁使用的全局变量,例如,在特定的时间段内,该第一全局变量被调用的次数超过第二阈值,则认为该第一全局变量是热点全局变量,即在本发明实施例,编译器解析的是热点函数和热点全局变量,这样,预取引擎预取到的数据是频繁地被调用的热点函数中热点全局变量关联的数据,可以提高预取的效率,进一步可以提高Cache的命中率。
在某些实现方式中,预取引擎也可以执行预取指令,例如,编译器可以在生成代码的过程中确定预取地址,将该预取地址输出到文本文件或者二进制工具中,预取引擎读到预取地址时,预取内存中预取地址对应的数据,这样,编译器告知预取引擎预取地址,预取引擎可以根据预取地址精确地预取内存中的数据,编译器与预取引擎并行执行,通过软件与硬件协作的方式进行预取数据,这样,可以降低编译器运行的复杂度,提高数据预取的效率,进一步能够提高Cache的命中率。
第二方面,提供了一种预取数据的方法,该方法包括:获取编译器确定的N个函数的起始地址和所述N个函数的第一全局变量的起始地址,所述N为大于或等于1的整数;根据所述N个函数的起始地址和所述N个函数的第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中。
在某些实现方式中,所述获取N个函数的起始地址和所述N个函数的第一全局变量的起始地址,包括:读取所述文本文件或所述二进制工具中所述编译器输入的所述N个函数的起始地址和所述第一全局变量的起始地址;其中,所述根据所述N个函数的起始地址和所述N个函数的第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中,包括:根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述缓存。
在某些实现方式中,所述根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述缓存,包括:读到文本文件或者二进制工具中的所述N个函数的起始地址时,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中;或者读到所述文本文件或者所述二进制工具中的所述N个函数的起始地址的第一时间段之前,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中;或者读到所述文本文件或者所述二进制工具中的所述N个函数的起始地址的第二时间段之后,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中。
在某些实现方式中,所述预取引擎具体还用于:根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量,预取所述内存中所述至少一个结构体成员变量的关联数据到所述Cache中。
在某些实现方式中,所述预取引擎具体用于:根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述每个结构体成员变量在所述内存中的所述Cache line索引号预取所述内存中的数据。
在某些实现方式中,所述预取引擎具体还用于:读取所述文本文件或所述二进制工具中的所述N个函数的起始地址和所述第一全局变量的起始地址,并根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述Cache。
在某些实现方式中,所述预取引擎具体还用于:根据访问先后顺序预取所述内存中第一全局变量关联数据到所述Cache中,所述访问先后顺序是编译器确定的第一全局变量和第二全局变量的访问先后顺序。
第三方面,提供了一种预取数据的方法,该方法包括:编译器获取N个函数和所述N个函数的第一全局变量,所述N为大于或等于1的整数;所述编译器确定所述N个函数的起始地址和所述第一全局变量的起始地址;预取引擎获取所述编译器确定的所述N个函数的起始地址和所述第一全局变量的起始地址,并根据所述N个函数的起始地址和所述第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中。
在某些实现方式中,所述预取引擎为通过硬件实现的用于将数据从所述内存预取到所述缓存的引擎。
在某些实现方式中,编译器获取N个函数和所述N个函数的第一全局变量,包括:编译器解析所述N个函数使用的至少一个结构体成员变量,所述M个结构体成员变量包括所述至少一个结构体成员变量;所述编译器确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量;预取引擎获取所述编译器确定的所述N个函数的起始地址和所述第一全局变量的起始地址,并根据所述N个函数的起始地址和所述第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中,包括:所述预取引擎根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量,预取所述内存中所述至少一个结构体成员变量的关联数据到所述缓存中。
在某些实现方式中,编译器获取N个函数和所述N个函数的第一全局变量,解析所述N个函数使用的至少一个结构体成员变量,所述M个结构体成员变量包括所述至少一个结构体成员变量;确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量;根据所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量确定所述至少一个结构体成员变量中每个结构体成员变量在所述内存中的缓存行Cache line的索引号;预取引擎获取所述编译器确定的所述N个函数的起始地址和所述第一全局变量的起始地址,并根据所述N个函数的起始地址和所述第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中,包括:所述预取引擎根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述每个结构体成员变量在所述内存中的所述Cache line索引号预取所述内存中所述至少一个结构体成员变量的关联数据到所述缓存中。
在某些实现方式中,所述编译器确定所述N个函数的起始地址和所述第一全局变量的起始地址之后,所述方法还包括:编译器将所述N个函数的起始地址和所述第一全局变量的起始地址输出到文本文件或二进制工具中,所述预取引擎读取所述文本文件或所述二进制工具中的所述N个函数的起始地址和所述第一全局变量的起始地址,并根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述缓存中。
在某些实现方式中,所述方法还包括:所述编译器在编译过程中执行:获取所述N个函数的第二全局变量;确定所述第一全局变量与所述第二全局变量的访问先后顺序,所述预取引擎根据所述访问先后顺序预取所述内存中所述第一全局变量的关联数据到所述缓存中。
第四方面,提供了一种预取数据的装置,用于执行第一方面或第一方面任意可能的实现方式中的方法。
第五方面,提供了一种预取数据的装置,用于执行第二方面或第二方面任意可能的实现方式中的方法。
第六方面,提供了一种预取数据的系统,包括第一方面或第一方面任意一种可能的实现方式中的装置和第二方面或第二方面任意一种可能的实现方式中的装置。
在第六方面的第一种可能的实现方式中,所述预取引擎为通过硬件实现的用于将数据从所述内存预取到所述缓存的引擎。
在某些实现方式中,所述预取引擎具体用于:读到文本文件或者二进制工具中的所述N个函数的起始地址时,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述Cache中;或读到文本文件或者二进制工具中的所述N个函数的起始地址的第一时间段之前,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述Cache中;或读到文本文件或者二进制工具中的所述N个函数的起始地址的第二时间段之后,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述Cache中。
第七方面,提供了一种预取数据的装置,该装置包括:至少一个处理器、存储器和通信接口。其中,该至少一个处理器、该存储器和该通信接口均通过总线连接,该存储器用于存储计算机执行指令,该至少一个处理器用于执行该存储器存储的计算机执行指令,使得该装置可以通过该通信接口与其它装置进行数据交互来执行第一方面或第一方面的任意可能的实现方式中的方法。
第八方面,提供了一种预取数据的装置,该装置包括:至少一个处理器、存储器和通信接口。其中,该至少一个处理器、该存储器和该通信接口均通过总线连接,该存储器用于存储计算机执行指令,该至少一个处理器用于执行该存储器存储的计算机执行指令,使得该装置可以通过该通信接口与其它装置进行数据交互来执行第二方面或第二方面的任意可能的实现方式中的方法。
第九方面,提供了一种计算机可读介质,用于存储计算机程序,该计算机程序包括用于执行第一方面或第一方面的任意可能的实现方式中的方法的指令。
第十方面,提供了一种计算机可读介质,用于存储计算机程序,该计算机程序包括用于执行第二方面或第二方面的任意可能的实现方式中的方法的指令。
可见,编译器首先获取N个函数和N个函数的第一全局变量,然后确定N个函数的起始地址以及第一全局变量的起始地址,预取引擎根据N个函数的起始地址和第一全局变量的起始地址预取内存中的第一全局变量的关联数据到Cache中,N个函数的起始地址可以理解为预取数据的预取时机,预取引擎与编译器可以并行执行,预取时机为N个函数的起始地址而不不依赖于现有技术的软件预取指令,提高了预取的灵活性。
附图说明
图1示出了本发明实施例的计算机系统架构的示意图。
图2示出了本发明实施例的应用场景的示意图。
图3示出了根据本发明实施例的预取数据的方法示意图。
图4示出了根据本发明实施例的预取数据的装置示意图。
图5示出了根据本发明实施例的另一预取数据的装置示意图。
图6示出了根据本发明实施例的预取数据的系统示意图。
图7示出了根据本发明实施例的预取数据的装置示意图。
图8示出了根据本发明实施例的另一预取数据的装置示意图。
图9示出了根据本发明实施例的另一预取数据的系统示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚描述,显然,所描述的实施例是本发明的一部分实施例,而不是全部实施例。
应理解,本发明实施例中的预取数据的方法可以应用于单核或多核计算机系统,该多核计算机系统可以为通用的多核计算机系统。该多核计算机系统中的CPU可以包括多个核,多个核之间可以通过系统总线或者交叉开关矩阵通信,该多核计算机系统中可以包括CPU中的多核共享的缓存(Cache)。
图1示出了本发明实施例的计算机系统架构100示意图,包括中央处理器(CentralProcessing Unit,简称“CPU”)110、缓存120和内存130。
CPU 110用于从缓存120中获取频繁使用的数据进行处理,或者也可以直接从内存130中获取数据进行处理,当CPU要访问内存中的数据时,首先查询缓存120中是否有CPU需要访问的数据以及需要访问的数据是否过期,如果需要访问的数据在缓存120中且未过期则从缓存120中读出数据,若CPU访问的数据在缓存120中则称为命中,若CPU访问的数据不在缓存120中则称为不命中。
缓存120用于存储从内存130中预取到的数据,以备CPU110获取,减少CPU110从内存130中获取数据的时延。
内存130用于存储数据,内存130中的频繁使用的数据用于存储到缓存120中。
缓存120的命中率越高,表示数据预取的效果越好,并且,Cache可以包括指令Cache和数据Cache。
图2示出了本发明实施例中应用场景200示意图,包括编译器210、文本文件或者二进制工具220、预取引擎230、内存130。
编译器210,用于获取函数和函数的全局变量,并解析函数和函数的全局变量的起始地址,编译器210也可以解析函数的冷热分区,编译器210也可以解析函数的变量的访问的先后顺序,编译器解析到的这些起始地址、冷热分区、访问先后顺序等信息可以称为预取信息,编译器210可以将预取信息输出到文本文件或者二进制工具220中,当然编译器210也可以将预取信息直接输出给预取引擎230,以便于预取引擎230根据预取信息预取内存130中的数据到Cahce120中。
文本文件或者二进制工具220,用于接收编译器210输出的预取信息,并保存,以便于预取引擎230读取预取信息。
预取引擎230,用于读取文本文件或者二进制工具220中保存的预取信息,根据读取到的预取信息去内存130中预取数据。
内存130,用于保存变量关联的数据,以备预取引擎230读取。
因此,本发明实施例通过编译器210分析函数的预取信息,预取引擎230根据预取信息预取内存130中的数据,编译器210与预取引擎230可以并行执行,可以进一步提高预取数据的效率,并且,预取数据的时机为编译器210解析到的预取信息,这样,预取的时机不依赖于现有技术的软件预取指令,提高了预取的灵活性。
图3示出了本发明实施例的预取数据的方法300示意图,应用于计算机系统,例如该计算机系统可以是嵌入式系统,所述计算机系统包括预取引擎230、内存130以及编译器210,所述方法300包括S310,S320和S330,其中,所述编译器210在编译过程中执行S310和S320,所述预取引擎230执行S330,具体为:
S310,获取N个函数和所述N个函数的第一全局变量,所述N为大于或等于1的整数。
S320,确定所述N个函数的起始地址和所述第一全局变量的起始地址。
S330,所述预取引擎230根据编译器210确定的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存130中的所述第一全局变量的关联数据到缓存120中。
可选地,S310和S320可以在链接过程中完成,在S310中N个函数和N个函数的第一全局变量可以同时获取,也可以分别获取。同样地,在S320中确定所述N个函数的起始地址和所述第一全局变量的起始地址可以是同时确定的,也可以是分别确定的,在分别确定N个函数的起始地址和所述第一全局变量的起始地址时,可以先确定N个函数的起始地址再确定第一全局变量的起始地址,或者可以先确定第一全局变量的起始地址在确定N各函数的起始地址,本发明实施例不限于此。
应理解,该N个函数的起始地址可以是N个函数共用的一个起始地址,该N个函数的起始地址可以理解为该N个函数中一个函数的起始地址,该N个函数的起始地址作为预取数据的时机来触发预取引擎230预取内存130中的数据到缓存120中。第一全局变量的起始地址是用于预取引擎预取内存130中与第一全局变量关联的数据到缓存120中的地址,即该第一全局变量的起始地址可以是编译器解析出来的在内存130中与该第一全局变量关联的数据的起始地址,也可以是编译器解析出来的第一全局变量在程序中的起始地址,该第一全局变量在程序中的起始地址与该第一全局变量的关联数据在内存130中的起始地址存在有映射关系,预取引擎230根据第一全局变量在程序中的起始地址和映射关系确定该第一全局变量的关联数据在内存130中的起始地址,然后预取内存130中与该第一全局变量的关联数据到缓存120中。
具体地,在程序人员开发过程中可以确定该N个函数可能与某一特定业务相关的函数,因此在预取数据的过程中可以将该N个函数的变量整体从内存130中预取到缓存120中,编译器210在编译过程中可以获取到该N个函数以及该N个函数的第一全局变量,然后编译器210确定N个函数和第一全局变量得到N个函数的起始地址和第一全局变量在所述内存130中的第一全局变量的起始地址,N个函数的起始地址可以理解为预取引擎230(PrefetchEngine)的预取时机,预取引擎230与编译器210可以并行执行,预取的时机可以依赖N个函数的起始地址,这样,预取的时机不依赖于现有技术的软件预取指令,提高了预取的灵活性。
预取引擎230读到N个函数的起始地址之前或之后,根据该第一全局变量的起始地址预取内存130中的数据,可以避免现有技术采用prefetch指令在函数内进行预取的局限性,且现有技术prefetch指令预取数据的时机由开发人员指定在函数内,本发明实施例可以是在函数执行开始之前的预设时间内预取数据,或者解析到该N个函数地址时预取数据,或者解析到该N个函数地址之后预设时间内预取数据,预取的时机不限定在函数内,具体预取的时机可以根据特定的规则确定,这样,进一步可以提高预取数据的灵活性。
更具体地,只要预取引擎230获取到N个函数的起始地址和第一全局变量的起始地址就可以将内存130中的数据预取到缓存120中,例如,预取引擎230可以根据当前程序运行的速度确定预取的时机,若当前程序运行速度较快,可以在读取N个函数的起始地址的第一时间段之前就开始预取数据;若当前程序运行速度较慢,可以在读取到N个函数的起始地址的第二时间段之后再开始预取数据;也可以在读到N个函数的起始地址时,预取引擎230就开始预取数据。又例如,预取引擎230可以根据缓存120的大小,以及数据在缓存120中的生存周期,确定预取数据的时机。又例如,编译器210可以将预取的时机告知预取引擎230,预取引擎230根据该编译器210发送的预取时机进行预取数据,因此,相比与现有技术相比,可以进一步提高预取的灵活性。
可选地,当N等于1时,即一个函数对应一个起始地址,这样,预取引擎230预取的是该函数的第一全局变量的关联数据;当N大于1时,即多个函数可以共用一个起始地址,这样,预取引擎230预取的是多个函数中的第一全局变量的关联数据,即预取引擎230不仅可以将内存130中一个函数的全局变量对应的数据预取到缓存120中,也可以将内存130中多个函数的全局变量对应的数据预取到缓存120中。可选地,该多个函数可以是与特定业务相关的多个函数,例如为了实现某项特殊的业务,该项业务需要用到该多个函数,这样,可以通过一个起始地址就可以将内存130中多个函数的第一全局变量的对应的数据预取的到缓存120中,进一步提高了预取的效率。
进一步地,S320,包括:编译器210解析到N个函数时,解析该N个函数的起始地址;或者包括:编译器210在开始编译的阶段就将所有函数的起始地址都解析出来,当编译器210解析到第一函数时,查找之前解析出来的起始地址确定该N个函数的起始地址,这样,可以节省程序运行的时间。S320,包括:编译器210解析到第一全局变量时,解析该第一全局变量的起始地址;或者包括:编译器210在开始编译的阶段就将所有的全局变量的起始地址都解析出来,当编译器210解析到第一全局变量时,查找之前解析出来的起始地址确定该第一全局变量的起始地址。
作为一个可选实施例,在所述确定所述第一全局变量的起始地址之后,所述方法300还包括:所述编译器210将所述N个函数的起始地址和所述第一全局变量的起始地址输出到文本文件或者二进制工具220中,所述预取引擎230读取所述文本文件或者二进制工具220中的所述N个函数的起始地址和所述第一全局变量的起始地址,并且根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存130中的所述第一全局变量的关联数据到所述缓存120中。
编译器210将N个函数的起始地址和第一全局变量的起始地址保存在文本文件或者二进制工具220中,预取引擎230从文本文件或二进制工具220中读取N个函数的起始地址和第一全局变量的起始地址,并根据该N个函数的起始地址确定预取数据的时机,在确定的预取时机预取内存130中第一全局变量的起始地址对应的数据;当然,也可以将Cache line的索引号,或者结构体成员变量的地址偏移量等有关于预取的信息的保存在文本文件中或者二进制工具中,以备预取引擎230根据文本文件或者二进制工具220中的预取信息预取内存130中的数据。
作为一个可选实施例,所述预取引擎230根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存130中的所述第一全局变量的关联数据到所述缓存120,包括:所述预取引擎230读到文本文件或者二进制工具220中的所述N个函数的起始地址时,预取所述内存130中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存120中;或所述预取引擎230读到文本文件或者二进制工具220中的所述N个函数的起始地址的第一时间段之前,预取所述内存130中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存120中;或所述预取引擎230读到文本文件或者二进制工具220中的所述N个函数的起始地址的第二时间段之后,预取所述内存130中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存120中。
具体地,编译器210输出N个函数的起始地址和第一全局变量的起始地址,可以以文本的形式或者二进制工具将N个函数的起始地址和第一全局变量的起始地址保存,当预取引擎230在文本或者二进制工具中获取N个函数的起始地址和第一全局变量的起始地址,当预取引擎230读到N个函数的起始地址时,根据第一全局变量的起始地址在内存130中预取第一全局变量关联的数据到缓存120中,这样通过软件分析,硬件获取的协作预取方式,可以提高预取数据的灵活性,软件将程序实际运行情况解析出来之后输出到文本或者二进制工具中,以备硬件读取,硬件根据N个函数的起始地址和第一全局变量的起始地址预取内存130中的数据,并且硬件可以扩展缓存120的内存130,这样,可以进一步提高缓存120的命中率。
进一步地,编译器210可以将预取时机的标识信息保存在文本文件或二进制工具230中,当预取引擎230读到预取时机标识信息时,根据该预取时机的标识信息预取内存130中的与第一全局变量关联的数据到缓存120中。例如,预取时机的标识信息可以是第一标识、第二标识或第三标识,第一标识用于标识预取引擎230在读到N个函数的起始地址时预取第一全局变量的关联数据到缓存120中;第二标识用于标识预取引擎230读到N个函数的起始地址的第一时间段内之前,预取第一全局变量的关联数据到缓存120中;第三标识用于标识预取引擎230读到N个函数的起始地址的第二时间段之后,预取第一全局变量的关联数据到缓存120中。
应理解,本发明实施例中,当编译器210确定N个函数的起始地址和第一全局变量的起始地址后,预取时机可以由编译器210确定,也可以由预取引擎230确定,或者根据特定的规则确定,也可以根据协议规定,本发明实施例不限于此。
也应理解,该N个函数的第一全局变量可以是一个全局变量或多个全局变量,本发明实施例不限于此。当然,第一全局变量不限于仅为N个函数的全局变量,即两个不同的函数可以有相同的全局变量,或者预取引擎230两个不同的函数可以有不同的全局变量,本发明实施例不限于此。
进一步地,当预取到内存130中该第一全局变量对应的数据时,当N个函数之外的第二函数也调用了该第一全局变量时,CPU可以直接在缓存120中获取该第一全局变量对应的数据,避免现有技术当其他函数仍然需要该数据时,需要再次获取数据,可以节省信令开销。
在本发明实施例中,可以获取N个函数的第一全局变量,预取的是内存130中该N个函数的第一全局变量对应的数据;也可以是仅获取N个函数,预取的是内存130中该N个函数中全部变量对应的数据;也可以是仅获取第一全局变量,预取的是内存130中该第一全局变量对应的数据,本发明实施例不限于此。
作为一个例子,在实际应用过程中,用户可以通过编译器210接口告知编译器210哪些函数需要分析,编译器210可以指定与用户及硬件的交互接口,并解析出函数用到的全局变量,对识别出来的全局变量的数据归属的Cache line做统计归类,自动生成全局符号,将Cache line信息与函数保存在符号中,备硬件读取。硬件定制预取引擎230外设,预取引擎230外设用于预取数据到缓存120中,硬件也可以定制汇编指令用于触发预取引擎230预取,预取引擎230从编译器210自动生成的全局符号中读取预取信息。
作为一个可选实施例,所述第一全局变量包括M个结构体成员变量,M大于或等于1。
具体地,当第一全局变量是全局结构体成员变量,该全局结构体成员变量包括M个结构体成员变量,可以预取引擎230根据N个函数的起始地址和第一全局变量的起始地址,提前将内存130中与该M个结构体成员变量关联的数据预取到内存130中,这样,可以避免现有技术通过在函数中插入预取指令预取M个结构体成员变量的关联数据,并且现有技术预取M个结构体成员变量的关联数据需要多个预取指令才能预取到内存130中与该M个结构体成员变量关联的数据,这样会增加程序运行的时间,并且M个结构体成员变量预取的时机仅通过程序员指定,很难保证编译器210编译调度的时间与程序员指定的M个结构体成员变量的预取时机的协调,因此也不能保证缓存120的命中率,例如,当M个结构体成员变量的预取指令插入太早,数据过早预取到缓存120中时,可能CPU还没有访问缓存120,数据就被替换掉,当M个结构体成员变量的预取指令插入过晚,CPU访问缓存120时,会造成延时。
作为一个可选实施例,S320,包括:解析所述N个函数使用的至少一个结构体成员变量,所述M个结构体成员变量包括所述至少一个结构体成员变量;S330,包括:所述预取引擎230根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量,预取所述内存130中所述至少一个结构体成员变量的关联数据到所述缓存120中。
具体地,第一全局变量包括M个结构体成员变量,但是N个函数用到的可能是M个结构体成员变量中的至少一个结构体成员变量,因此编译器210需要解析N个函数用到的结构体成员变量,解析到N个函数用到了M个结构体成员变量中的至少一个结构体成员变量,然后确定该至少一个结构体成员变量中每个结构体成员变量相对于第一全局变量的起始地址的地址偏移量,将第N个函数的起始地址、第一全局变量的起始地址以及每个结构体成员变量相对于第一全局变量的起始地址的地址偏移量保存在文本或二进制工具中,以备预取引擎230读取,当预取引擎230读到N个函数的起始地址时,可以根据相对第一全局变量的起始地址的地址偏移量预取每个结构体成员变量关联的数据到缓存120,这样,可以根据实际的N个函数的需求解析出N个函数用到的结构体成员变量,在CPU访问缓存120中的至少一个结构成员变量关联的数据之前,预取引擎230就可以将N个函数用到的结构体成员变量关联的数据预取到缓存120,可以提高预取的效率,可以使得在CPU访问缓存120时,缓存120存有CPU需要用到的结构体成员变量对应的数据,进一步能够提高缓存120的命中率。
作为一个可选实施例,所述N个函数为热点函数,所述第一全局变量为热点全局变量。
应理解,该热点函数用于表示频繁使用的函数,例如,在特定时间段内,该N个函数被调用的次数超过第一阈值时,则认为该N个函数是热点函数。该热点全局变量用于表示频繁使用的全局变量,例如,在特定的时间段内,该第一全局变量被调用的次数超过第二阈值,则认为该第一全局变量是热点全局变量,即在本发明实施例,编译器210解析的是热点函数和热点全局变量,这样,预取引擎230预取到的数据是频繁地被调用的热点函数中热点全局变量关联的数据,可以提高预取的效率,进一步可以提高缓存120的命中率。
可选地,编译器210也可以解析函数是热函数还是冷函数,热函数可以是编译器210需要频繁编译的函数,冷函数可以是编译器210编译次数较少的函数,例如,冷热函数的划分可以是在特定的时间范围内该函数被编译的次数大于设定的第三阈值时为热函数,该函数被编译的次数小于设定的第三阈值时为冷函数。
作为一个可选实施例,所述S320,包括:变量包括所述至少一个结构体成员变量;确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量;根据所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量确定所述至少一个结构体成员变量中每个结构体成员变量在所述内存130中的缓存行Cache line的索引号;S330,包括:所述预取引擎230根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述每个结构体成员变量在所述内存130中的所述Cache line索引号预取所述内存130中的数据。
具体地,当编译器210可能获取到第一全局变量中至少一个结构体成员变量中每个结构体成员变量相对于第一全局变量的偏移地址之后,编译器210结合芯片的Cacheline长度、每个结构体成员变量的偏移地址以及第一全局变量的起始地址映射每个结构体成员变量的在内存130中Cache line的索引号,编译器210将N个函数的起始地址、第一全局变量的起始地址和Cache line索引号保存在文本中或二进制工具中,当两个结构体成员变量有相同的Cache line的索引号,则编译器210返回给预取引擎230一个Cache line的索引号,预取引擎230根据该Cache line的索引号预取内存130中的数据,进一步提高了预取的效率,避免现有技术仅通过prefetch指令一次只能取到特定的数据,不能一次预取到两个结构体成员变量的数据。
作为一个例子,若N个函数使用了8(编号分别为1、2、3、4、5、6、7、8)个结构体成员变量,根据每个结构体成员变量相对于第一全局变量的起始地址的偏移地址确定该8个结构体成员变量的对应的数据在内存130中的Cache line索引号为:编号为1和2的结构体成员变量的Cache line的索引号为1,编号为3、4、5和6的结构体成员变量的Cache line的索引号为2,编号为7的结构体成员变量的Cache line的索引号为3,编号为8的结构体成员变量的Cache line的索引号为4,编译器210将内存130中索引号为1、2、3和4的Cache line起始地址输出到文本文件或者二进制工具220中,预取引擎230读取文本文件或者二进制工具220中的索引号,预取引擎230可以在内存130中通过4个Cache line就可以将8个结构体成员变量对应的数据预取到,而现有技术预取8个结构体成员变量对应的数据需要8个Cacheline,因此,本发明实施例能够减少预取数据的次数,提高预取数据的效率,降低预取数据的时延。
作为一个可选实施例,所述方法300还包括:所述编译器210在编译的过程中执行:获取所述N个函数的第三全局变量;确定所述第一全局变量和所述第三全局变量在所述内存130中的缓存行Cache line的索引号,所述预取引擎230根据所述Cache line索引号预取所述内存130中的所述的第一全局变量和所述第三全局变量的关联数据到所述缓存120中。
具体地,若存在多个全局变量时,编译器210根据多个全局变量确定每个全局变量的在内存130中的Cache line的索引号,预取引擎230根据每个全局变量的在内存130中Cache line的索引号预取内存130中的数据。
作为一个可选实施例,在所述确定所述至少一个结构体成员变量中每个结构体成员变量相对于所述第一全局变量的起始地址的地址偏移量之前,所述方法300还包括:编译器210解析所述M个结构体成员变量得到所述M个结构体成员变量中每个结构体成员变量相对于所述第一全局变量的起始地址的地址偏移量;其中,确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量,包括:在所述M个结构体成员变量中每个结构体成员变量相对于所述第一全局变量的起始地址的地址偏移量中,确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量。
具体地,当第一全局变量包括M个结构体成员变量时,编译器210需要解析M个结构体成员变量中每个结构体成员变量相对于第一全局变量的起始地址的地址偏移量,当编译器210解析到N个函数只用到M个结构体成员变量中的至少一个结构体成员变量时,可以在M个结构体成员变量中每个结构体成员变量的地址偏移量查找至少一个结构体成员变量的地址偏移量。
可选地,编译器210不仅可以将地址解析出来,也可以解析至少一个结构体成员变量在全局结构体成员变量中的层级,例如结构体成员变量是第一全局变量的第一层结构体成员变量还是第二层结构体成员变量等。例如,全局变量A包括3个结构体成员变量A1,A2,A3,而A1本身又是一个结构体变量包括4个结构体成员变量A11,A12,A13,A14。编译器210解析到A11时可以将A11属于第二层结构体成员变量的信息输出到文本文件或二进制工具中。
作为一个可选实施例,在所述获取N个函数和所述N个函数的第一全局变量之前,所述编译器210在编译过程中执行:获取P个函数和所述P个函数中每个函数的至少一个全局变量,所述P个函数包括所述N个函数,P大于或等于1,P大于或等于N;解析所述P个函数中每个函数的起始地址;解析所述每个函数的至少一个全局变量中每个全局变量的起始地址;其中,获取所述N个函数和所述N个函数的第一全局变量,包括:在所述P个函数中确定所述N个函数;在所述N个函数的至少一个全局变量中确定所述第一全局变量;确定所述N个函数的起始地址,包括:在所述P个函数中每个函数的起始地址中确定所述N个函数的起始地址;确定所述第一全局变量的起始地址,包括:在所述每个全局变量的起始地址中确定所述第一全局变量的起始地址。
具体地,整个程序运行过程中可以包括P个函数,P个函数中的每个函数包括至少一个全局变量,编译器210解析P个函数中每个函数的起始地址,在解析后的至少一个起始地址中确定N个函数的起始地址;编译器210还需要解析该N个函数的至少一个全局变量中每个全局变量的起始地址,在每个全局变量的起始地址中匹配得到第一全局变量的起始地址,在编译器210初级编译阶段就可以将P个函数以及P个函数中每个函数对应的至少一个全局变量的起始地址都解析出来,形成映射表,当编译器210解析到N个函数时,解析N个函数用到的第一全局变量在映射表中查找第一全局变量的起始地址。
可选地,程序开发人员可以根据用户的操作习惯,确定P个函数和所述P个函数中每个函数的至少一个全局变量,可以将P个函数和所述P个函数中每个函数的至少一个全局变量以表的形式进行存储,例如,生成全局变量库,更进一步地,可以采用关键字的方式指定P个函数和所述P个函数中每个函数的至少一个全局变量,例如通过关键字attribute属性smar_prefetch_var指定P个函数和所述P个函数中每个函数的至少一个全局变量。
例如,无线L2业务中,使用了大量的全局结构体成员变量,如1382代码中MUM_RefreshRlcSharePam函数中用到全局结构体成员变量g_dMACUserTable中的结构体成员变量的地址偏移信息如下:
q_dMACUserTable→stDmacPublicInfo→dMACCfgCommonPara→u8MacActiveFlag→offset 26080
q_dMACUserTable→stDmacPublicInfo→stCaCfgPara→ucSCellIndex→offset1184
q_dMACUserTable→stDmacPublicInfo→dMACCfgCommonPara→u8CellId→offset 26112
q_dMACUserTable→stDmacPerformanceUsrInfo→dMACMeasAllowInfo→ulDlUserTpRbNum→offset 214464
q_dMACUserTable→stDmacDlschUsrInfo→DlFluxInnerPara→ulAmbrSumBytes→offset 165408
q_dMACUserTable→stDmacPublicInfo→dMACCfgCommonPara→ucActiveDrbNum→offset 26328
q_dMACUserTable→stDmacDlschUsrInfo→DlFluxInnerPara→adMacRlcFluxInner→ulSendDataBytes→offset 165440
q_dMACUserTable→stDmacDlschUsrInfo→stDlschUsrInfo→astDMACRlcInfo→stMacRlcMeasureStru→ulTPWinByteNum→offset 134368
上述这些结构体成员变量分散在内存130的不同的位置,函数调用数据时,内存130中的数据存储的较离散,并且不同函数访问的结构体成员变量不同,若采用现有技术预取上述这些结构体成员变量关联的数据时,在每个函数中需要插入预取指令,多个结构体成员变量就需要多个预取指令,并且每个结构体成员变量预取数据的时机都由程序开发人员指定,不能保证编译器210编译调度的时间与程序开发人员指定的时间匹配,可能CPU需要访问缓存120中的数据时,数据还没有被预取到缓存120,或者过早的将数据预取到缓存120中,数据还没有被CPU访问就被替换掉,导致缓存120的命中率降低,本发明实施例在执行函数开始时就可以将该函数用到的数据预取到缓存120中,或者在用到这些结构体成员变量的数据之前就可以将数据预取到缓存120中,并且编译器210可以解析出结构体成员变量的顺序,先预取顺序在先的数据到缓存120中,之后预取顺序在后的数据到缓存120中,可以进一步提高数据预取的效率,提高缓存120的命中率。
作为一个可选实施例,所述获取N个函数和所述N个函数的第一全局变量,包括:
所述编译器210在编译过程中,接收编译指示信息,并根据所述编译指示信息获取所述N个函数和所述N个函数的第一全局变量,其中,所述编译指示信息用于指示N个函数和所述N个函数的所述第一全局变量,和/或所述编译指示信息用于指示所述N个函数和所述N个函数不使用的全局变量。
具体地,通过设定关编译指示信息的方式来指示N个函数和N个函数的第一全局变量,例如,可以在N个函数中的程序最前面的函数的函数头前面制定编译指示信息,该编译指示信息指示该N个函数和该N个函数的第一全局变量,这样,N个函数和N个函数的第一全局变量可以只用一个编译指示信息就可以指示。具体该编译指示信息可以是关键字attribute属性smar_prefetch_var。
当然,也可以通过编译指示信息来指示该N个函数和该N个函数没有使用到的全局变量,这样编译器210在解析该N个函数的全局变量时,就不会继续解析该N个函数没有使用到的全局变量,可以节省解析的资源开销。编译指示信息也可以指示该N个函数使用的和不使用的全局变量。
可选地,该编译指示信息可以以命令行的形式插入到函数头前。
可选地,编译指示信息不仅可以指示至少一个全局变量,也可以指示至少一个全局变量中每个全局变量包括的结构体成员变量,即相当于将需要特别关注的全局变量以编译指示信息的方式进行标识,编译器210可以解析编译指示信息指示的结构体成员变量。
作为一个例子,下列程序可以在函数头前作为一个预取编译指示信息,例如该编译指示信息可以为关键字,通过关键字来指定全局变量:
_attribute_((smart_prefetch_var(“qx_aDLSynUsrLink”)))
_attribute_((smart_prefetch_var(“q_dMACUserTable”)))
Void MUX_RefreshRlcSharePam(UINT32ulCellId)
作为一个可选实施例,所述获取N个函数和所述N个函数的第一全局变量,包括:所述编译器210在编译过程中,从文本文件中读取第一对应关系和/或第二对应关系,并根据所述第一对应关系和/或所述第二对应关系获取所述N个函数和所述N个函数的第一全局变量,其中,所述第一对应关系用于指示所述N个函数和所述N个函数的所述第一全局变量,和/或,所述第二对应关系用于指示所述N个函数和所述N个函数不使用的全局变量。
在本发明实施例中,多个函数以及需要分析的多个函数的全局变量可以以列表的形式存储在文本文件中,一个函数需要分析的或不需要分析的全局变量之间可以用对应关系表示,N个函数需要分析的第一全局变量用第一关系表示,N个函数不需要分析的变量用第二对应关系表示。当编译器210解析到N个函数时,根据第一对应关系和/或第二对应关系在文本文件的列表中查找这N个函数的第一全局变量。当然,编译器可以将列表中的多个函数与多个函数对应的全局变量的起始地址提前可以解析出来,在执行到N个函数时,在提前解析出来的起始地址中查找该N个函数的起始地址。若第一全局变量包括M个结构体成员变量时,N个函数只用到了M个结构体成员变量中的部分结构体成员变量,可以将部分结构体成员变量与N个函数的对应关系也存储在文本文件中,以备编译器210获取,这样编译器就不用解析N个函数使用到的至少一个结构体成员变量了,而是直接根据文本文件中的对应关系查找,这样可以实现集中管理,减少操作的复杂性。
具体地,第一对应关系可以是函数用到的全局变量组成的列表,例如,第一个函数中用到全局变量a,第二个函数用到全局变量a,将第一函数和第二函数用到的变量以列表的形式保存起来,预取引擎需要将内存中与第一函数和第二函数用到的全局变量a的关联数据预取到Cache中,例如a可以为前述的第一全局变量,编译器通过查找列表的方式找到第一个函数和第二个函数,以及两个函数的全局变量a。类似地,第二对应关系也可以是函数没有使用到的全局变量组成的列表。这样,可以实现集中管理,减少操作的复杂性。
作为一个可选实施例,获取所述N个函数的第一全局变量,包括:解析所述N个函数的分区,所述分区包括热分区和冷分区;在所述热分区中获取所述第一全局变量。
具体地,编译器210在编译时能解析出N个函数的冷热分区,当编译器210解析出N个函数中的冷分支时,可以将筛掉不执行的冷分支访问的全局变量信息,这样就可以预取到热分支中的全局变量对应的数据,避免将冷分支中的全局变量对应的数据也预取到缓存120中,这样可以避免不必要的预取,能够提高预取的效率。
进一步地,热分区用于表示N个函数的分区被访问的次数频繁,冷分区用于表示N个函数的分区被访问的次数较少。例如,在特定时间段内,该N个函数的第一分区被访问的次数超过预设阈值时,则认为第一分区是热分区。在特定的时间段内,该N个函数的第二分区被访问的次数小于预设阈值,则认为第二分区是冷分区。
作为一个可选实施例,在获取所述N个函数的第一全局变量之后,所述方法300还包括:所述编译器210在编译的过程中执行:获取所述N个函数的第二全局变量,确定所述第一全局变量与所述第二全局变量的访问先后顺序。S330,包括:所述预取引擎230根据访问先后顺序预取所述内存130中所述第一全局变量关联数据到所述缓存120。
具体地,编译器210不仅可以解析到N个函数的第一全局变量和第二全局变量,编译器210也可以结合编译的控制信息流,解析到第一全局变量和第二全局变量在程序运行过程中的先后顺序,预取引擎230可以根据先后顺序预取第一全局变量的关联的数据到缓存120中,缓存120先存入的数据是先被CPU访问,例如,当编译器210解析到第一全局变量在第二全局变量之前时,预取引擎230先预取内存130中第一全局变量对应的数据;当编译器210解析到第二全局变量在第一全局变量之前时,预取引擎230先预取内存130中第二全局变量对应的数据,然后再预取第一全局变量对应的数据,这样,预取引擎230预取的顺序是程序执行的顺序,避免过早的将不必要的数据预取到缓存120中,占不必要的存储空间,并且也可以避免过早的预取到后面执行的数据时,在该数据还没有被CPU读取就被过早的替换掉,进一步提高缓存120的命中率,提高系统的性能。
可选地,当第一全局变量包括M个结构体成员变量时,N个函数采用的是M个结构体成员变量中的至少一个结构体成员变量,编译器210可以结合编译的控制信息流解析该至少一个结构体成员变量中每个结构体成员变量执行的先后顺序,预取引擎230根据每个结构体成员变量执行的先后顺序预取内存130中结构体成员变量对应的数据。
可选地,N个函数调用了第一全局变量和第二全局变量,若第一全局变量包括M个结构体成员变量,第二全局变量包括Q个结构体成员变量,编译器210可以解析N个函数用到的L个结构体成员变量,L个结构体成员变量由M个结构体成员变量的部分结构体成员变量和Q个结构体成员变量的部分结构体成员变量组成,这样,编译器210也可以解析到L个结构体成员变量中每个结构体成员变量相对于第一全局变量的起始地址的偏移量或相对于第二全局变量的起始地址的偏移量,编译器210也可以解析该L个结构体成员变量的调用顺序,并将该L个结构体成员变量的调用顺序保存在文本文件或二进制工具220中,以备预取引擎230预取L个结构体成员变量关联的数据到缓存120,Q为大于或等于1的整数,L为大于等于1且小于等于M+Q的整数,也即N个函数采用的至少一个结构体成员变量是否来自与一个全局变量,还是来自不同的全局变量,本发明实施例不限于此。
作为一个可选实施例,S330,包括:所述预取引擎230读到文本文件或二进制工具220中的所述N个函数的起始地址时,预取所述内存130中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存120中;或
读到文本文件或者二进制工具220中的所述N个函数的起始地址的第一时间段之前,预取所述内存130中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存120中;或
读到文本文件或者二进制工具220中的所述N个函数的起始地址的第二时间段之后,预取所述内存130中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存120中。
作为一个可选实施例,预取引擎230也可以执行预取指令,例如,编译器210可以在生成的代码的过程中确定预取地址,将该预取地址输出到文本文件或者二进制工具220中,预取引擎230读到预取地址时,去预取内存130中预取地址对应的数据,这样,编译器210告知预取引擎230预取地址,预取引擎230可以根据预取地址精确地预取内存130中的数据,编译器210与预取引擎230并行执行,通过软件与硬件协作的方式进行预取数据,这样,可以降低编译器210运行的复杂度,提高数据预取的效率,进一步能够提高缓存120的命中率。
作为一个可选实施例,本发明实施例可以应用到多核计算机系统,若采用现有技术的预取数据的方法,软件指令在预取数据的过程中需要用户告知内存130中多核中每个核对应的核号,然后预取内存130中核号对应的数据,本发明实施例,在多个计算机系统中,每个核可以有预取引擎230,每个核各自的预取引擎230都可以获取到自身的核号,也即在预取数据的过程中不需要用户告知具体的核号,预取引擎230就可以在内存130中相应的位置获取数据。
应理解,本发明实施例提到的缓存120可以是一级缓存,也可以是二级缓存,也可以是三级缓存等,也可以是一级缓存、二级缓存和三级缓存中的至少一个缓存等,本发明实施例不限于此。
作为一个可选实施例,下面示出了本发明实施例的预取数据的方法,该方法包括:
Sep1,编译器210获取P个函数和P个函数中每个函数的至少一个全局变量。
可选地,可以通过编译指示信息获取该P个函数和P个函数中每个函数的至少一个全局变量,也可以通过提前设定的P个函数与P个函数中每个函数的至少一个全局变量的对应关系(例如前述的文本文件中的第一对应关系和/或第二对应关系)获取该P个函数和P个函数中每个函数的至少一个全局变量。
Sep2,编译器210解析P个函数中每个函数得到每个函数的起始地址。
Sep3,编译器210解析每个函数的至少一个全局变量起始地址(若为全局结构体成员变量,解析该全局结构体成员变量相对于全局变量的地址偏移量)。
可选地,Sep2和Sep3的先后顺序不限定,Sep2可以在Sep3之前,Sep3也可以在Sep2之前,本发明实施例不限于此。
Sep4,编译器210分析指定的N个函数时,在P个函数查找到N个函数,在Step2中得到的起始地址中确定N个函数的起始地址。
当然,也可以不需要Step1至Step3步骤,编译器在分析到N个函数时,直接解析就可以得到该N个函数的起始地址。
Sep5,编译器210解析该N个函数的分区,筛选掉冷分区,保留热分区,编译器210解析N个函数用到的第一全局变量和第二全局变量,解析热分区中的第一全局变量和第二全局变量(若为全局结构体成员变量,解析N个函数用到的第一结构体成员变量和第二结构体成员变量)。
Sep6,编译器210结合编译的控制流信息,确定第一全局变量和第二全局变量被调用的先后顺序(若为全局结构体成员变量,确定该第一结构体成员变量和第二结构体成员变量被访问的先后顺序)。
Sep7,在Sep3中得到的至少一个全局变量的起始地址中,得到第一全局变量的起始地址和第二全局变量的起始地址(若为全局结构体成员变量,得到的是第一结构体成员变量和第二结构体成员变量相对于全局变量的地址偏移量,或者第一结构体成员变量和第二结构体成员变量在内存130中的Cache line索引号)。
当然,也可以不需要Step1至Step3步骤,编译器在分析到N个函数时,直接解析该第一全局变量和第二全局变量的起始地址就可以得到起始地址。
Sep8,编译器210将N个函数的起始地址、第一全局变量的起始地址、第二全局变量的起始地址以及第一全局变量和第二全局变量的访问先后顺序保存在文本中或二进制工具中(若为第一全局变量包括结构体成员变量,编译器210将N个函数的起始地址、第一全局变量的起始地址、该第一结构体成员变量和第二结构体成员变量被调用的先后顺序、第一结构体成员变量和第二结构体成员变量相对于全局变量的地址偏移量保存在文本或二进制工具中)。
Sep9,预取引擎230根据文本或二进制工具中保存的信息预取内存130中的数据到缓存120中。
这样,编译器210可以根据提前设定的编译指示信息或者对应关系,确定出P个函数和该P个函数中每个函数对应的至少一个全局变量,若至少一个全局变量为全局结构体成员变量确定出每个全局结构体成员变量的结构体成员变量,并且编译器210解析P个函数中每个函数的起始地址,每个函数对应的全局变量的起始地址,或者每个结构体成员变量的地址偏移量,形成一个映射表。当编译器210解析特定的N个函数,先解析该N个函数的分区,筛选掉冷分区,在热分区中解析该N个函数用到的全局变量或全局结构体成员变量,在映射表中匹配N个函数得到N个函数的起始地址,匹配N个函数用到的第一全局变量得到第一全局变量的起始地址,或者匹配N个函数用到的结构体成员变量得到结构体成员变量的地址偏移量。然后,编译器210解析出N个函数用到的全局变量的先后顺序,或者解析出N个函数用到的结构体成员变量的先后顺序,编译器210将起始地址信息和先后顺序信息保存在文本中或二进制工具中以备预取引擎230预取数据到缓存120中。
上面结合图3对本发明实施提供的预取数据的方法进行描述,下面结合图4至图6描述本发明实施例提供的预取数据的装置和系统。
图4示出了本发明实施例提供的预取数据的装置400,例如该装置400可以为编译器210,计算机系统包括该装置400、预取引擎230和内存130,该装置400包括:
获取模块410,用于获取N个函数和所述N个函数的第一全局变量,所述N为大于或等于1的整数;
确定模块420,用于确定所述N个函数的起始地址和所述第一全局变量的起始地址,以便于预取引擎能够根据所述N个函数的起始地址和所述第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存120中。
作为一个可选实施例,所述第一全局变量包括M个结构体成员变量,M大于或等于1。
作为一个可选实施例,所述确定模块420具体用于:解析所述N个函数使用的至少一个结构体成员变量,所述M个结构体成员变量包括所述至少一个结构体成员变量;确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量,以便于所述预取引擎230能够根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量,预取所述内存130中所述至少一个结构体成员变量的关联数据到所述缓存120中。
作为一个可选实施例,所述确定模块420具体还用于:解析所述N个函数使用的至少一个结构体成员变量,所述M个结构体成员变量包括所述至少一个结构体成员变量;所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量;根据所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量确定所述至少一个结构体成员变量中每个结构体成员变量在所述内存130中的缓存行Cache line的索引号,以便于所述预取引擎230能够根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述每个结构体成员变量,在所述内存130中的所述Cache line索引号预取预取所述内存130中所述至少一个结构体成员变量的关联数据到所述缓存120中。
作为一个可选实施例,所述装置400还包括:解析模块,用于在所述确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量之前,解析所述M个结构体成员变量得到所述M个结构体成员变量中每个结构体成员变量相对于所述第一全局变量的起始地址的地址偏移量;所述确定模块420具体还用于:在所述M个结构体成员变量中每个结构体成员变量相对于所述第一全局变量的起始地址的地址偏移量中,确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量。
作为一个可选实施例,所述获取模块410还用于:在所述获取N个函数和所述N个函数的第一全局变量之前,获取P个函数和所述P个函数中每个函数的至少一个全局变量,所述P个函数包括所述N个函数,P大于或等于1,P大于或等于N;解析模块还用于解析所述P个函数中每个函数的起始地址;解析所述P个函数中每个函数的至少一个全局变量中每个全局变量的起始地址;所述获取模块410具体用于:在所述P个函数中确定所述N个函数;在所述N个函数的至少一个全局变量中确定所述第一全局变量;所述确定模块420具体还用于:在所述P个函数中每个函数的起始地址中确定所述N个函数的起始地址;在所述每个全局变量的起始地址中确定所述第一全局变量的起始地址。
作为一个可选实施例,所述获取模块410具体用于:在所述装置400编译过程中,接收编译指示信息,并根据所述编译指示信息获取所述N个函数和所述N个函数的第一全局变量,其中,所述编译指示信息用于指示N个函数和所述N个函数的所述第一全局变量,和/或所述编译指示信息用于指示所述N个函数和所述N个函数不使用的全局变量。
作为一个可选实施例,所述获取模块410具体还用于:在所述装置400编译过程中,从文本文件中读取第一对应关系和/或第二对应关系,并根据所述第一对应关系和/或所述第二对应关系获取所述N个函数和所述N个函数的第一全局变量,其中,所述第一对应关系用于指示所述N个函数和所述N个函数的所述第一全局变量的,和/或,所述第二对应关系用于指示所述N个函数和所述N个函数不使用的全局变量。
作为一个可选实施例,所述装置400还包括:输出模块,用于在所述确定所述第一全局变量的起始地址之后,将所述N个函数的起始地址和所述第一全局变量的起始地址输出到文本文件或者二进制工具220中,以便于所述预取引擎230读取所述文本文件或所述二进制工具中的所述N个函数的起始地址和所述第一全局变量的起始地址,并根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存130中的所述第一全局变量的关联数据到所述缓存120。
作为一个可选实施例,所述获取模块410具体用于:解析所述N个函数的分区,所述分区包括热分区和冷分区;在所述热分区中获取所述第一全局变量。
作为一个可选实施例,所述获取模块410还用于:获取所述N个函数的第二全局变量;所述确定模块420还用于:确定所述第一全局变量与所述第二全局变量的访问先后顺序,以便于所述预取引擎230能够根据所述访问先后顺序预取所述内存130中所述第一全局变量关联数据到所述缓存120。
作为一个可选实施例,所述获取模块410还用于:获取所述N个函数的第三全局变量;所述确定模块420还用于:确定所述第一全局变量和所述第三全局变量在所述内存130中的缓存行Cache line的索引号,以便于所述预取引擎230能够根据所述Cache line索引号预取所述内存130中的所述的第一全局变量的关联数据到所述缓存120中。
作为一个可选实施例,所述N个函数为热点函数,所述第一全局变量为热点全局变量。
应理解,这里的装置400以功能模块的形式体现。这里的术语“模块”可以指ASIC、电子电路、用于执行一个或多个软件或固件程序的处理器(例如共享处理器、专有处理器或组处理器等)和存储器、合并逻辑电路和/或其它支持所描述的功能的合适组件。在一个可选例子中,本领域技术人员可以理解,装置400可以具体为上述实施例中的编译器210,装置400可以用于执行上述方法实施例中与编译器210对应的各个流程和/或步骤,为避免重复,在此不再赘述。
图5示出了本发明实施例提供的预取数据的装置500,例如该装置500可以为预取引擎230,该装置500包括:
获取模块510,用于获取N个函数的起始地址和所述N个函数的第一全局变量的起始地址,所述N为大于或等于1的整数。
预取模块520,用于根据所述N个函数的起始地址和所述N个函数的第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中。
作为一个可选实施例,所述获取模块510具体用于:读取所述文本文件或所述二进制工具中编译器输入的所述N个函数的起始地址和所述第一全局变量的起始地址;所述预取模块520具体用于:根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述缓存。
作为一个可选实施例,所述预取模块510具体还用于:读到文本文件或者二进制工具中的所述N个函数的起始地址时,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中;或读到所述文本文件或者所述二进制工具中的所述N个函数的起始地址的第一时间段之前,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中;或读到所述文本文件或者所述二进制工具中的所述N个函数的起始地址的第二时间段之后,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中。
图6示出了本发明实施例提供的预取数据的系统600,该系统600包括装置400和装置500,所述装置500用于根据所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存130中的所述第一全局变量的关联数据到缓存120中。
作为一个可选实施例,所述装置500具体用于:读到文本文件或者二进制工具220中的所述N个函数的起始地址时,预取所述内存130中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存120中;或
读到文本文件或者二进制工具220中的所述N个函数的起始地址的第一时间段之前,预取所述内存130中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存120中;或
读到文本文件或者二进制工具220中的所述N个函数的起始地址的第二时间段之后,预取所述内存130中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存120中。
因此,通过装置400确定的N个函数的起始地址和第一全局变量的起始地址,并且装置400将N个函数的起始地址和第一全局变量的起始地址输出到文本文件或者二进制工具220中,装置500读取文本文件或者二进制工具220中的N个函数的起始地址和第一全局变量的起始地址,装置400和装置500可以根据N个函数的起始地址协调预取数据的时机,例如在装置500读到N个函数的起始地址前的第一时间段,或者在装置500读到N个函数的起始地址时,或者在装置500在读到N个函数的起始地址后的第二时间段,预取数据。例如,第一时间段为3个cycle,第二时间段为4个cycle,也可以将N个函数的起始地址前的3个cycle进行预取数据的这一事件用第一标识信息进行标识,将N个函数的起始地址后的4个cycle进行预取数据的这一事件用第二标识信息标识,将读到N个函数的起始地址时预取数据的这一事件用第三标识信息进行标识,并将这三个标识信息中的一个标识信息保存在文本文件或者二进制工具220中,装置500根据标识信息确定采用预取数据的时机,进一步能够提高预取数据的灵活性。
作为一个可选实施例,所述装置500具体还用于:根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量,预取所述内存130中所述至少一个结构体成员变量的关联数据到所述缓存120中。
作为一个可选实施例,所述装置500具体还用于:根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述每个结构体成员变量在所述内存130中的所述Cacheline索引号预取所述内存130中的数据。
作为一个可选实施例,所述装置500具体还用于:读取所述文本文件或所述二进制工具中的所述N个函数的起始地址和所述第一全局变量的起始地址,并根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存130中的所述第一全局变量的关联数据到所述缓存120。
作为一个可选实施例,所述装置500具体还用于:根据访问先后顺序预取所述内存130中访问顺序在前的全局变量关联数据到所述缓存120。
装置400也可以将N个函数的起始地址、第一全局变量的起始地址以及N个函数用到的多个全局变量对应的数据在内存130中的Cache line索引号输出到二进制工具或文本文件中,装置500根据N个函数的起始地址、第一全局变量的起始地址和全局变量在内存130中的Cache line索引号预取内存130中多个全局变量的关联数据到缓存120中。装置400也可以解析多个全局变量的访问先后顺序,将N个函数的起始地址、第一全局变量的起始地址以及多个全局变量的访问先后顺序的信息输出到文本文件或者二进制工具220中,装置500根据N个函数的起始地址、第一全局变量的起始地址和多个全局变量的访问的先后顺序预取主存中的数据到缓存120中。
当第一全局变量是结构体成员变量时,装置400也可以将N个函数的起始地址、第一全局变量的起始地址以及N个函数使用到结构体成员变量的地址偏移量输出到文本文件或者二进制工具220中,预取引擎230根据文本文件或者二进制工具220中的N个函数的起始地址、第一全局变量的起始地址和结构体成员变量的地址偏移量预取内存130中的数据到缓存120中。装置400也可以将N个函数的起始地址、第一全局变量的起始地址以及N个函数使用到的结构体成员变量在内存130中的Cache line索引号输出到文本文件或者二进制工具220中,装置500根据文本文件或者二进制工具220中的N个函数的起始地址、第一全局变量的起始地址和Cache line索引号预取内存130中的数据到缓存120中。装置400也可以解析到多个结构体成员变量的访问先后顺序,将多个结构体成员变量的访问的先后顺序信息、N个函数的起始地址以及第一全局变量的起始地址输出到文本文件或者二进制工具220中,预取引擎230根据多个结构体成员变量的访问的先后顺序、N个函数的起始地址以及第一全局变量的起始地址预取内存130中的多个结构体成员变量的关联数据到缓存120中。
应理解,文本文件或者二进制工具220也可以保存多个全局变量的访问先后顺序信息、多个结构体成员变量的访问的先后顺序信息、多个全局变量的Cache line索引号、多个结构体成员变量的Cache line索引号、多个结构体成员变量的地址偏移量中的至少一种,以及N个函数的起始地址和第一全局变量的起始地址。装置500根据这些信息预取内存130中的数据到缓存120中。或者文本文件或者二进制工具220也可以保存函数与起始地址的对应关系,例如,一个函数用一个起始地址,还是多个函数用一个起始地址。本发明实施例不限于此。
图7示出了本发明实施例提供的预取数据的装置700,例如该装置700可以为计算机,该计算机可以用于实现前述实施例中编译器的功能。
具体的,该装置700包括处理器710和存储器720;可选地,该装置700还包括通信接口730;所述处理器710、所述存储器720和所述通信接口730均通过总线740连接;存储器720包括内存130和外存等。处理器710可以为一个或多个,每个处理器710包括一个或多个处理核。
总线型的连接方式仅是示例性的,处理器和存储器等器件也可以通过其他连接方式连接,例如以处理器为中心,存储器等其他器件都连接在处理器上。
存储器720用于存储计算机可执行的指令;处理器710用于读取所述计算机可执行的指令并实现本发明前述实施例所提供的方法。具体的,处理器710用于获取N个函数和所述N个函数的第一全局变量,所述N为大于或等于1的整数;确定所述N个函数的起始地址和所述第一全局变量的起始地址,以便于预取引擎能够根据所述N个函数的起始地址和所述第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中,所述N为大于或等于1的整数。值得注意的是,这里的缓存可以与处理器710集成在一起,也可以独立设置。
更具体的方法实现可参考前述方法实施例所述,在此不再赘述。需要说明的是,预取引擎具体是如何预取数据的,本发明实施例并不做限定。
图8示出了本发明实施例提供的预取数据的装置800,该装置800可以为计算机。该装置800包括:至少一个处理器810、存储器820和预取引擎230,可选地,该装置800还包括通信接口830;所述至少一个处理器810、所述存储器820、所述预取引擎230和所述通信接口830均通过总线840连接。
总线型的连接方式仅是示例性的,处理器和存储器等器件也可以通过其他连接方式连接,例如以处理器为中心,存储器等其他器件都连接在处理器上。
存储器820用于存储计算机可执行的指令,例如前述实施例中所述的编译器;处理器810则读取所述存储器820存储的计算机可执行的指令实现N个函数的起始地址和所述N个函数的第一全局变量的起始地址的确定,然后指示预取引擎230获取该N个函数的起始地址和所述N个函数的第一全局变量的起始地址,预取引擎230根据该个函数的起始地址和N个函数的第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中,所述N为大于或等于1的整数。
预取引擎230的更多具体实现可参考前述方法实施例,在此不再赘述。需要说明的是,编译器或其他程序或硬件模块如何获取N个函数的起始地址和第一全局变量的起始地址,本发明实施例并不做限定。
图9示出了本发明实施例提供的预取数据的计算机系统900,该系统900包括:处理器910、外存920、预取引擎940、缓存950、内存960和总线930;示例性的,处理器910、预取引擎940、外存920、缓存950和内存960均通过总线930连接,外存920存储有编译器的软件程序,该软件程序被处理器910读取到内存960中后执行以实现前述实施例介绍的编译器实现的方法。
具体的,编译器获取N个函数和所述N个函数的第一全局变量,所述N为大于或等于1的整数;编译器确定所述N个函数的起始地址和所述第一全局变量的起始地址;预取引擎获取所述编译器确定的所述N个函数的起始地址和所述第一全局变量的起始地址,并根据所述N个函数的起始地址和所述第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中。其中,本领域技术人员应理解,编译器为软件实现时,编译器执行的动作实际是处理器910执行的。
总线型的连接方式仅是示例性的,处理器和存储器等器件也可以通过其他连接方式连接,例如以处理器为中心,存储器等其他器件都连接在处理器上。
在其他一些实现方式中,可以将外存920和内存960统称为存储器,存储器中也可以包括缓存950。除图9示出的方式之外,缓存950还可以集成在处理器910上。
其他具体实现方式可参考前述实施例,在此不再赘述。
因此,本发明实施例通过编译器分析函数的预取信息,预取引擎根据预取信息预取内存中的数据,编译器与预取引擎可以并行执行,可以进一步提高预取数据的效率,并且,预取数据的时机为编译器210解析到的预取信息,这样,预取的时机不依赖于现有技术的软件预取指令,提高了预取的灵活性。
应理解,本文中术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。
本领域普通技术人员可以意识到,结合本文中所公开的实施例中描述的各方法步骤和单元,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各实施例的步骤及组成。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。本领域普通技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本发明所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另外,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口、装置或单元的间接耦合或通信连接,也可以是电的,机械的或其它的形式连接。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本发明实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以是两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
所述集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(Read-Only Memory,简称为“ROM”)、随机存取存储器(Random Access Memory,简称为“RAM”)、磁碟或者光盘等各种可以存储程序代码的介质。
以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。

Claims (33)

1.一种预取数据的方法,其特征在于,包括:
获取N个函数和所述N个函数的第一全局变量,所述N为大于或等于1的整数;
确定所述N个函数的起始地址和所述第一全局变量的起始地址,以便于预取引擎能够根据所述N个函数的起始地址和所述第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中。
2.根据权利要求1所述的方法,其特征在于,所述第一全局变量包括M个结构体成员变量,所述M为大于或等于1的整数。
3.根据权利要求2所述的方法,其特征在于,所述确定所述N个函数的起始地址和所述第一全局变量的起始地址,以便于所述预取引擎能够根据所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到缓存中,包括:
解析所述N个函数使用的至少一个结构体成员变量,所述M个结构体成员变量包括所述至少一个结构体成员变量;
确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量,以便于所述预取引擎根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量,预取所述内存中所述至少一个结构体成员变量的关联数据到所述缓存中。
4.根据权利要求2所述的方法,其特征在于,所述确定所述N个函数的起始地址和所述第一全局变量的起始地址,以便于所述预取引擎能够根据所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到缓存中,包括:
解析所述N个函数使用的至少一个结构体成员变量,所述M个结构体成员变量包括所述至少一个结构体成员变量;
确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量;
根据所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量确定所述至少一个结构体成员变量中每个结构体成员变量在所述内存中的缓存行Cache line的索引号,以便于所述预取引擎能够根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述每个结构体成员变量在所述内存中的所述Cache line索引号预取所述内存中所述至少一个结构体成员变量的关联数据到所述缓存中。
5.根据权利要求3或4所述的方法,其特征在于,在所述确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量之前,所述方法还包括:
解析所述M个结构体成员变量得到所述M个结构体成员变量中每个结构体成员变量相对于所述第一全局变量的起始地址的地址偏移量;
其中,确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量,包括:
在所述M个结构体成员变量中每个结构体成员变量相对于所述第一全局变量的起始地址的地址偏移量中,确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量。
6.根据权利要求1至5中任一项所述的方法,其特征在于,所述获取N个函数和所述N个函数的第一全局变量,包括:
接收编译指示信息,并根据所述编译指示信息获取所述N个函数和所述N个函数的第一全局变量,其中,所述编译指示信息用于指示N个函数和所述N个函数的所述第一全局变量,和/或所述编译指示信息用于指示所述N个函数和所述N个函数不使用的全局变量。
7.根据权利要求1至5中任一项所述的方法,其特征在于,所述获取N个函数和所述N个函数的第一全局变量,包括:
从文本文件中读取第一对应关系和/或第二对应关系,并根据所述第一对应关系和/或所述第二对应关系获取所述N个函数和所述N个函数的第一全局变量,其中,所述第一对应关系用于指示所述N个函数和所述N个函数的所述第一全局变量,和/或,所述第二对应关系用于指示所述N个函数和所述N个函数不使用的全局变量。
8.根据权利要求1至7中任一项所述的方法,其特征在于,在所述确定所述N个函数的起始地址和所述第一全局变量的起始地址之后,所述方法还包括:
将所述N个函数的起始地址和所述第一全局变量的起始地址输出到文本文件或二进制工具中,以便于所述预取引擎能够读取所述文本文件或所述二进制工具中的所述N个函数的起始地址和所述第一全局变量的起始地址,并根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述缓存中。
9.根据权利要求1至8中任一项所述的方法,其特征在于,获取所述N个函数的第一全局变量,包括:
解析所述N个函数的分区,所述分区包括热分区和冷分区;
在所述热分区中获取所述第一全局变量。
10.根据权利要求1至9中任一项所述的方法,其特征在于,所述方法还包括:
获取所述N个函数的第二全局变量;
确定所述第一全局变量与所述第二全局变量的访问先后顺序,以便于所述预取引擎根据所述访问先后顺序预取所述内存中所述第一全局变量的关联数据到所述缓存中。
11.根据权利要求1至10中任一项所述的方法,其特征在于,所述方法还包括:
获取所述N个函数的第三全局变量;
确定所述第一全局变量和所述第三全局变量在所述内存中的Cache line的索引号,以便于所述预取引擎根据所述Cache line索引号预取所述内存中的所述第一全局变量和所述第三全局变量的关联数据到所述缓存中。
12.根据权利要求1至11中任一项所述的方法,其特征在于,所述N个函数为热点函数,所述第一全局变量为热点全局变量。
13.一种预取数据的方法,其特征在于,包括:
获取编译器确定的N个函数的起始地址和所述N个函数的第一全局变量的起始地址,所述N为大于或等于1的整数;
根据所述N个函数的起始地址和所述N个函数的第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中。
14.根据权利要求13所述的方法,其特征在于,所述获取N个函数的起始地址和所述N个函数的第一全局变量的起始地址,包括:
读取所述文本文件或所述二进制工具中所述编译器输入的所述N个函数的起始地址和所述第一全局变量的起始地址;
其中,所述根据所述N个函数的起始地址和所述N个函数的第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中,包括:
根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述缓存。
15.根据权利要求14所述的方法,其特征在于,所述根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述缓存,包括:
读到文本文件或者二进制工具中的所述N个函数的起始地址时,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中;或
读到所述文本文件或者所述二进制工具中的所述N个函数的起始地址的第一时间段之前,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中;或
读到所述文本文件或者所述二进制工具中的所述N个函数的起始地址的第二时间段之后,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中。
16.一种预取数据的方法,其特征在于,包括:
编译器获取N个函数和所述N个函数的第一全局变量,所述N为大于或等于1的整数;
所述编译器确定所述N个函数的起始地址和所述第一全局变量的起始地址;
预取引擎获取所述编译器确定的所述N个函数的起始地址和所述第一全局变量的起始地址,并根据所述N个函数的起始地址和所述第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中。
17.根据权利要求16所述的方法,其特征在于,所述预取引擎为通过硬件实现的用于将数据从所述内存预取到所述缓存的引擎。
18.一种预取数据的装置,其特征在于,所述装置包括:
获取模块,用于获取N个函数和所述N个函数的第一全局变量,所述N为大于或等于1的整数;
确定模块,用于确定所述N个函数的起始地址和所述第一全局变量的起始地址,以便于预取引擎能够根据所述N个函数的起始地址和所述第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中。
19.根据权利要求18所述的装置,其特征在于,所述第一全局变量包括M个结构体成员变量,所述M为大于或等于1的整数。
20.根据权利要求19所述的装置,其特征在于,所述确定模块具体用于:
解析所述N个函数使用的至少一个结构体成员变量,所述M个结构体成员变量包括所述至少一个结构体成员变量;
确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量,以便于所述预取引擎能够根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量,预取所述内存中所述至少一个结构体成员变量的关联数据到所述缓存中。
21.根据权利要求19所述的装置,其特征在于,所述确定模块具体还用于:
解析所述N个函数使用的至少一个结构体成员变量,所述M个结构体成员变量包括所述至少一个结构体成员变量;
确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量;
根据所述至少一个结构体成员变量中每个结构体成员变量的地址偏移量确定所述至少一个结构体成员变量中每个结构体成员变量在所述内存中的缓存行Cache line的索引号,以便于所述预取引擎能够根据所述N个函数的起始地址、所述第一全局变量的起始地址和所述每个结构体成员变量,在所述内存中的所述Cache line索引号预取所述内存中所述至少一个结构体成员变量的关联数据到所述缓存中。
22.根据权利要求20或21所述的装置,其特征在于,所述装置还包括:
解析模块,用于在所述确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量之前,解析所述M个结构体成员变量得到所述M个结构体成员变量中每个结构体成员变量相对于所述第一全局变量的起始地址的地址偏移量;
所述确定模块具体还用于:
在所述M个结构体成员变量中每个结构体成员变量相对于所述第一全局变量的起始地址的地址偏移量中,确定所述至少一个结构体成员变量中每个结构体成员变量相对所述第一全局变量的起始地址的地址偏移量。
23.根据权利要求18至22中任一项所述的装置,其特征在于,所述获取模块具体用于:
接收编译指示信息,并根据所述编译指示信息获取所述N个函数和所述N个函数的第一全局变量,其中,所述编译指示信息用于指示N个函数和所述N个函数的所述第一全局变量,和/或所述编译指示信息用于指示所述N个函数和所述N个函数不使用的全局变量。
24.根据权利要求18至22中任一项所述的装置,其特征在于,所述获取模块具体还用于:
从文本文件中读取第一对应关系和/或第二对应关系,并根据所述第一对应关系和/或所述第二对应关系获取所述N个函数和所述N个函数的第一全局变量,其中,所述第一对应关系用于指示所述N个函数和所述N个函数的所述第一全局变量,和/或,所述第二对应关系用于指示所述N个函数和所述N个函数不使用的全局变量。
25.根据权利要求18至24中任一项所述的装置,其特征在于,所述装置还包括:
输出模块,用于在所述确定所述N个函数的起始地址和所述第一全局变量的起始地址之后,将所述N个函数的起始地址和所述第一全局变量的起始地址输出到文本文件或二进制工具中,以便于所述预取引擎能够读取所述文本文件或所述二进制工具中的所述N个函数的起始地址和所述第一全局变量的起始地址,并且根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述缓存中。
26.根据权利要求18至25中任一项所述的装置,其特征在于,所述获取模块具体用于:
解析所述N个函数的分区,所述分区包括热分区和冷分区;
在所述热分区中获取所述第一全局变量。
27.根据权利要求18至26中任一项所述的装置,其特征在于,所述获取模块还用于:
获取所述N个函数的第二全局变量;
所述确定模块还用于:确定所述第一全局变量与所述第二全局变量的访问先后顺序,以便于所述预取引擎根据所述访问先后顺序预取所述内存中所述第一全局变量的关联数据到所述缓存。
28.根据权利要求18至27中任一项所述的装置,其特征在于,所述获取模块还用于:
获取所述N个函数的第三全局变量;
所述确定模块还用于:确定所述第一全局变量和所述第三全局变量在所述内存中的Cache line的索引号,以便于所述预取引擎根据所述Cache line索引号预取所述内存中的所述的第一全局变量和所述第三全局变量的关联数据到所述缓存中。
29.根据权利要求18至28中任一项所述的装置,其特征在于,所述第N个函数为热点函数,所述第一全局变量为热点全局变量。
30.一种预取数据的装置,其特征在于,所述装置包括:
获取模块,用于获取N个函数的起始地址和所述N个函数的第一全局变量的起始地址,所述N为大于或等于1的整数;
预取模块,用于根据所述N个函数的起始地址和所述N个函数的第一全局变量的起始地址预取内存中与所述第一全局变量关联的数据到缓存中。
31.根据权利要求30所述的装置,其特征在于,所述获取模块具体用于:
读取所述文本文件或所述二进制工具中编译器输入的所述N个函数的起始地址和所述第一全局变量的起始地址;
所述预取模块具体用于:
根据读取到的所述N个函数的起始地址和所述第一全局变量的起始地址预取所述内存中的所述第一全局变量的关联数据到所述缓存中。
32.根据权利要求31所述的装置,其特征在于,所述预取模块具体还用于:
读到文本文件或者二进制工具中的所述N个函数的起始地址时,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中;或
读到所述文本文件或者所述二进制工具中的所述N个函数的起始地址的第一时间段之前,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中;或
读到所述文本文件或者所述二进制工具中的所述N个函数的起始地址的第二时间段之后,预取所述内存中的所述第一全局变量的起始地址的所述第一全局变量的关联数据到所述缓存中。
33.一种预取数据的系统,其特征在于,所述系统包括权利要求18至29中任一项所述的装置和权利要求30至32中任一项所述的装置。
CN201610979946.6A 2016-11-08 2016-11-08 预取数据的方法、装置和系统 Active CN108073525B (zh)

Priority Applications (8)

Application Number Priority Date Filing Date Title
CN201610979946.6A CN108073525B (zh) 2016-11-08 2016-11-08 预取数据的方法、装置和系统
EP17869063.2A EP3534266B1 (en) 2016-11-08 2017-11-06 Method, apparatus and system for prefetching data
JP2019524061A JP6830534B2 (ja) 2016-11-08 2017-11-06 データプリフェッチング方法、装置、およびシステム
RU2019117778A RU2019117778A (ru) 2016-11-08 2017-11-06 Способ, устройство и система упреждающей выборки данных
CA3043127A CA3043127C (en) 2016-11-08 2017-11-06 Data prefetching method, apparatus, and system
KR1020197015445A KR102353213B1 (ko) 2016-11-08 2017-11-06 데이터 프리페칭 방법, 장치, 및 시스템
PCT/CN2017/109536 WO2018086494A1 (zh) 2016-11-08 2017-11-06 预取数据的方法、装置和系统
US16/405,869 US20190266094A1 (en) 2016-11-08 2019-05-07 Data Prefetching Method, Apparatus, And System

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201610979946.6A CN108073525B (zh) 2016-11-08 2016-11-08 预取数据的方法、装置和系统

Publications (2)

Publication Number Publication Date
CN108073525A true CN108073525A (zh) 2018-05-25
CN108073525B CN108073525B (zh) 2021-10-19

Family

ID=62110160

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201610979946.6A Active CN108073525B (zh) 2016-11-08 2016-11-08 预取数据的方法、装置和系统

Country Status (8)

Country Link
US (1) US20190266094A1 (zh)
EP (1) EP3534266B1 (zh)
JP (1) JP6830534B2 (zh)
KR (1) KR102353213B1 (zh)
CN (1) CN108073525B (zh)
CA (1) CA3043127C (zh)
RU (1) RU2019117778A (zh)
WO (1) WO2018086494A1 (zh)

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110413327A (zh) * 2019-07-16 2019-11-05 阿里巴巴集团控股有限公司 一种基于硬件抽象层的硬件驱动方法和装置
CN110765034A (zh) * 2018-07-27 2020-02-07 华为技术有限公司 一种数据预取方法及终端设备
CN113741411A (zh) * 2021-11-08 2021-12-03 西安热工研究院有限公司 一种分散控制系统全局变量点产物文件生成方法和系统
WO2023011236A1 (zh) * 2021-07-31 2023-02-09 华为技术有限公司 一种程序源码的编译优化方法及相关产品
CN116955223A (zh) * 2023-09-18 2023-10-27 浪潮电子信息产业股份有限公司 一种数据预取方法、系统、电子设备及计算机存储介质

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040117557A1 (en) * 2002-12-16 2004-06-17 Paulraj Dominic A Smart-prefetch
CN101652759A (zh) * 2007-04-10 2010-02-17 国际商业机器公司 可编程数据预取
CN101667159A (zh) * 2009-09-15 2010-03-10 威盛电子股份有限公司 传送请求区块的高速缓存系统及方法
US20110167224A1 (en) * 2008-09-17 2011-07-07 Panasonic Corporation Cache memory, memory system, data copying method, and data rewriting method
CN102981883A (zh) * 2012-10-29 2013-03-20 无锡江南计算技术研究所 一种编译器数据预取方法和装置
CN105426322A (zh) * 2015-12-31 2016-03-23 华为技术有限公司 一种数据的预取方法及装置

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5127103A (en) * 1987-10-14 1992-06-30 North American Philips Corporation Real-time tracing of dynamic local data in high level languages in the presence of process context switches
US6311260B1 (en) * 1999-02-25 2001-10-30 Nec Research Institute, Inc. Method for perfetching structured data
US8438365B2 (en) * 2006-10-06 2013-05-07 Calos Fund Limited Liability Company Efficient data loading in a data-parallel processor
JP5205777B2 (ja) * 2007-03-14 2013-06-05 富士通株式会社 プリフェッチ処理装置、プリフェッチ処理プログラムおよびプリフェッチ処理方法
US8255633B2 (en) * 2009-11-13 2012-08-28 International Business Machines Corporation List based prefetch

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040117557A1 (en) * 2002-12-16 2004-06-17 Paulraj Dominic A Smart-prefetch
CN101652759A (zh) * 2007-04-10 2010-02-17 国际商业机器公司 可编程数据预取
US20110167224A1 (en) * 2008-09-17 2011-07-07 Panasonic Corporation Cache memory, memory system, data copying method, and data rewriting method
CN101667159A (zh) * 2009-09-15 2010-03-10 威盛电子股份有限公司 传送请求区块的高速缓存系统及方法
CN102981883A (zh) * 2012-10-29 2013-03-20 无锡江南计算技术研究所 一种编译器数据预取方法和装置
CN105426322A (zh) * 2015-12-31 2016-03-23 华为技术有限公司 一种数据的预取方法及装置

Cited By (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110765034A (zh) * 2018-07-27 2020-02-07 华为技术有限公司 一种数据预取方法及终端设备
US11586544B2 (en) 2018-07-27 2023-02-21 Huawei Technologies Co., Ltd. Data prefetching method and terminal device
CN110413327A (zh) * 2019-07-16 2019-11-05 阿里巴巴集团控股有限公司 一种基于硬件抽象层的硬件驱动方法和装置
CN110413327B (zh) * 2019-07-16 2022-07-19 创新先进技术有限公司 一种基于硬件抽象层的硬件驱动方法和装置
WO2023011236A1 (zh) * 2021-07-31 2023-02-09 华为技术有限公司 一种程序源码的编译优化方法及相关产品
CN113741411A (zh) * 2021-11-08 2021-12-03 西安热工研究院有限公司 一种分散控制系统全局变量点产物文件生成方法和系统
CN113741411B (zh) * 2021-11-08 2022-02-01 西安热工研究院有限公司 一种分散控制系统全局变量点产物文件生成方法和系统
CN116955223A (zh) * 2023-09-18 2023-10-27 浪潮电子信息产业股份有限公司 一种数据预取方法、系统、电子设备及计算机存储介质
CN116955223B (zh) * 2023-09-18 2024-01-23 浪潮电子信息产业股份有限公司 一种数据预取方法、系统、电子设备及计算机存储介质

Also Published As

Publication number Publication date
EP3534266A1 (en) 2019-09-04
JP2020500368A (ja) 2020-01-09
EP3534266A4 (en) 2019-10-30
JP6830534B2 (ja) 2021-02-17
RU2019117778A (ru) 2020-12-10
US20190266094A1 (en) 2019-08-29
CA3043127A1 (en) 2018-05-17
KR20190070981A (ko) 2019-06-21
KR102353213B1 (ko) 2022-01-18
CA3043127C (en) 2023-06-20
WO2018086494A1 (zh) 2018-05-17
EP3534266B1 (en) 2024-02-14
CN108073525B (zh) 2021-10-19

Similar Documents

Publication Publication Date Title
CN108073525A (zh) 预取数据的方法、装置和系统
CN104298680B (zh) 数据统计方法及数据统计装置
CN112800095B (zh) 一种数据处理方法、装置、设备及存储介质
US20130205281A1 (en) Tracer based runtime optimization for dynamic programming languages
CN109101237A (zh) 代码的加密编译方法及装置
CN105653949B (zh) 一种恶意程序检测方法及装置
US6002875A (en) Method for the reduction of instruction cache miss rate using optimization data from trace data profiles
CN109460220A (zh) 报文预定义代码生成方法、装置、电子设备和存储介质
US20170193055A1 (en) Method and apparatus for data mining from core traces
US20170139836A1 (en) Near-memory accelerator for offloading pointer chasing operations from a processing element
CN106547587B (zh) 用于生成目标程序的配置文件的装置和方法
CN109271315B (zh) 脚本代码检测方法、装置、计算机设备及存储介质
CN109685545A (zh) 待发放虚拟网络资源预估方法、装置及电子设备
CN107197000B (zh) 静态动态混合缓存方法、装置及系统
CN102789377B (zh) 处理指令分组信息的方法和装置
CN108874994A (zh) 一种分块读取数据的方法、装置及计算机存储介质
CN107769987B (zh) 一种报文转发性能评估方法和装置
CN111756744B (zh) H5用户的识别方法、装置、设备及存储介质
US8438003B2 (en) Methods for improved simulation of integrated circuit designs
CN106649064A (zh) 一种应用操作监测方法及装置
CN108122123A (zh) 一种扩展潜在用户的方法及装置
CN111026508A (zh) 一种java智能卡及其虚拟机组件优化方法
CN109947834A (zh) 从不同数据源中获取数据的方法、装置及计算机设备
CN107741962B (zh) 数据缓存方法及服务器
CN104462368A (zh) 数据计算方法、装置和服务器

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