Linux prefetch函数的作用及使用方法简介 (linux prefetch())

Linux Prefetch函数的作用及使用方法简介

Prefetch函数是Linux内核中的一个重要函数,其主要作用是预先加载(预取)数据到Cache中,以提高程序的执行效率和性能。本文将介绍Prefetch函数的作用和使用方法,以帮助读者更好地理解和应用Linux内核中的Prefetch函数。

一、Prefetch函数的作用

Prefetch函数是内核中的一个重要函数,其作用是将某个数据块预取到Cache中,以提高对该数据块的访问效率。Prefetch函数通常被用于提高程序的执行效率和性能,特别是在处理大量数据时,如图像、音视频等媒体数据。

具体来说,Prefetch函数可以实现以下几个方面的作用:

1.预取数据到Cache中,提高数据访问速度。

2.调度磁盘读写,提高磁盘IO的并发处理能力。

3.提高程序的执行效率和性能,减少等待时间、延迟和耗时。

二、Prefetch函数的使用方法

Prefetch函数在Linux内核中有多种实现方式,在不同的情况下我们可以选择不同的Prefetch函数来使用。以下是几种常用的Prefetch函数的使用方法:

1. prefetch

prefetch是内核中最常用的Prefetch函数之一,它通常用于将数据块预取到L1和L2的Cache中。其使用方法如下:

#define prefetch(addr) __builtin_prefetch(addr)

其中,addr表示需要预取的数据块地址。prefetch函数通常放在需要预取的代码块之前,以保证代码块执行时需要的数据已经被预取到缓存中。

2. __prefetchw

__prefetchw是内核中另一种Prefetch函数,它主要用于将数据块预取到L2和L3的Cache中。其使用方法如下:

#define __prefetchw(addr) \

__builtin_ia32_prefetchw(addr)

其中,addr表示需要预取的数据块地址。__prefetchw函数通常用于需要随机访问的代码块之前。

3. prefetchw

prefetchw是Linux内核中另一种常用的Prefetch函数,它主要用于将数据块预取到L1和L2的Cache中。其使用方法如下:

#define prefetchw(addr) __builtin_prefetch(addr, 1)

其中,addr表示需要预取的数据块地址。prefetchw函数通常用于需要随机访问的代码块之前。

Prefetch函数在Linux内核中扮演着重要的角色,其使用方法也与不同的实现方式有关。因此,在使用Prefetch函数的过程中,我们需要根据具体的情况来选择最合适的Prefetch函数,并合理配置其参数,以提高程序的执行效率和性能。

三、结语

Prefetch函数是Linux内核中的一个重要函数,其主要作用是预先加载(预取)数据到Cache中,以提高程序的执行效率和性能。本文介绍了Prefetch函数的作用和使用方法,以帮助读者更好地理解和应用Linux内核中的Prefetch函数。在使用Prefetch函数的过程中,我们需要根据具体的情况来选择最合适的Prefetch函数,并合理配置其参数,以实现更佳的性能表现。

相关问题拓展阅读:

linux怎么查看tlb miss

在ARM架构下,TLB miss后的工作绝大多数情况是由hardwarepage table walk完成,特殊情况下hardware page table walk可以被关闭,此时发生TLB miss后CPU就会产生一个translationfault,剩下的工作由OS接管,完成对于translation fault的异常处理。

默认情况下,发生TLB miss后,hardware page table walk自动启动开始扫描内存中的pagetable,若找到相应PTE(page table entry),则自动完成TLB entry的重填工作;如果找不到,则发出一个page fault异常,然后OS接管处理page fault。内核中有do_page_fault函数,该函数从硬盘中调换页面进内存,更新页表,然后重新执行发生TLB miss的那条指令,hardware page table walk重新执行,完成TLB重填的工作。穗键掘

这里关心的是关闭hardware pagetable walk后,再发生TLB miss后的处理例程。如果发生这种情况,ARM CPU会发出一个translation fault(If translation table walksare disabled, for example, PD0 or EPD0 is set to 1 for TTBR0, or PD1 or EPD1 isset to 1 for TTBR1, the processor returns a Translation fault.见cortex-A15TRM p 5-5)。OS处理该异常的流程如下。

首先发生translation fault后,CPU会发出一个abort异常,然后跳转到该异常地址处(以发生指令预取中止异常为例,跳转到0x)去执行,该地址处存放的是一个跳转指令 (W(b)vector_pabt +stubs_offset),然后,通过判断,若发生该异常的指令处于usr模式,则跳转到__pabt_usr函数去执行,该函数中有条跳转指令bl CPU_PABORT_HANDLER,CPU_PABORT_HANDLER是个宏定义,对于ARMv7,该定义是:# define CPU_PABORT_HANDLER v7_pabort,

v7_pabort函数中就读取了IFSR和IFAR两个寄存器的值:

//pabort-v7.S

/*

*Function: v6_pabort

*

*Params : r0 = address of aborted instruction

*

*Returns : r0 = address of abort

*: r1 = IFSR

*

*Purpose : obtain information about current prefetch abort.

*/

.align

ENTRY(v7_pabort)

mrc p15,0, r0, c6, c0,@ get IFAR

mrc p15,0, r1, c5, c0,@ get IFSR

mov pc,lr

ENDPROC(v7_pabort)

IFAR中存储了发生异常的指令地址,IFSR中存储的是一个32位数,其中某些位表明异常类型等(参考Cortex-A15TRM p4-76)

剩余的工作就是根据以上两个寄存器提取出来的信息,调用相应函数亮改(do_PrefetchAbort——>do_translation_fault)进行处理。OS接管后的操作是(do_translation_fault函数),首先判断发生TLBmiss的那条指令是用户指令还是猜核系统指令,如果是系统指令则剩余工作是对页全局目录(pgd),页上级目录(pud),页中间目录(pmd)进行操作;如果是用户指令,则调用do_page_fault函数,剩下的工作就是page fault的处理过程,根据不同情况判断,包括权限检查,分配页面,发送SIGSEGV信号给进程,直接杀死进程等。不管哪种操作,OS都没有对TLB进行重填。

对于page fault的处理过程如下:在取数或者取指令时,发生指令或者数据的地址不存在的情况,则发生中止异常。

以取指发生异常为例。发生指令预取中止异常后,CPU自动跳转到0xC(可配置成0xfffffffc,这里不考虑)去执行,该地址处是一个跳转指令 (W(b)vector_pabt + stubs_offset),然后,通过判断,若发生该异常的指令处于usr模式,则跳转到__pabt_usr函数去执行,该函数中有条跳转指令bl CPU_PABORT_HANDLER,CPU_PABORT_HANDLER是个宏定义,对于ARMv7,该定义是:# defineCPU_PABORT_HANDLER v7_pabort,v7_pabort函数中就读取了IFSR和IFAR两个寄存器的值:

//pabort-v7.S

/*

* Function: v6_pabort

*

* Params : r0 = address ofaborted instruction

*

* Returns : r0 = address of abort

*: r1 = IFSR

*

* Purpose : obtain information aboutcurrent prefetch abort.

*/

.align 5

ENTRY(v7_pabort)

mrc p15, 0, r0, c6, c0, @ get IFAR

mrc p15, 0, r1, c5, c0, @ get IFSR

mov pc, lr

ENDPROC(v7_pabort)

IFAR中存储了发生异常的指令地址,IFSR中存储的是一个32位数,其中某些位表明异常类型等(参考Cortex-A15 TRM p4-76)

剩余的工作就是根据以上两个寄存器提取出来的信息,调用相应函数(do_PrefetchAbort——>do_page_fault)进行处理。

MIPS架构的体系分类

MIPS32®架构刷新了32位嵌入式处理器的性能标准。它是MIPS科技公司下一代高性能MIPS-Based™处理器SoC发展蓝图的基础,并向上兼容MIPS64®64位架构。MIPS架构拥有强大的指令集、从32位到64位的可扩展性、广泛的软件开发工具以及众多MIPS科技公司授权厂商的支持,是领先的嵌入式架构。MIPS32架构是以前的MIPS I™ 和 MIPS II™指令集架构(ISA)的扩展集,整合了专门用于嵌入式应用的功能强大的新指令,以及以往只在64位R4000™ 和 R5000® MIPS®处理器中能见到的已经验证的存储器管理和特权模式控制机制。通过整合强大的新功能、标准化特权模式指令以及支持前代ISA,MIPS32架构为未来所有基于32位MIPS的开发提供了一个坚实的高性能基础。

MIPS32架构基于一种固定长度的定期编码指令集,并采用导入/存储(load/store)数据模型。经改进,这种架构可支持高级语言的优化执行。其算术和逻辑运算采用三个操作数的形式,允许编译器优化复杂的表达式。此外,它还带有32个通用寄存器,让编译散纤器能够通过保持对寄存器内数据的频繁存取进一步优化代码的生成性能。

MIPS32架构从流行的R4000/R5000类64位处理器衍生出特权模式异常处理和存储器管理功能。它采用一组寄存器来反映缓存器、MMU、TLB及各个内核中实现的其它特权功能的配置。通过对特权模式和存储器管理进行标准化,并经由配置寄存器提供信息,MIPS32架构能够使实时操作系统、其它开发工具喊掘卖和应用代码同时被执行,并在MIPS32 和MIPS64处理器系列的各个产品之间复用。

它的高性能缓存器及存储器管理方案的灵活性仍继续成为MIPS架构的一大优势。MIPS32架构利用定义良好的缓存控制选项进一步扩展了这种优势。指令和数据缓存器的大小可以从256byte到4Mbyte。数郑逗据缓存可采用回写或直写策略。无缓存也是可选配置。存储器管理机制可以采用TLB或块地址转换(BAT)策略。利用TLB,MIPS32架构可满足Windows CE 和Linux的存储器管理要求。

由于增加了密集型数据处理、数据流和断言操作(predicated operations) ,可满足嵌入式市场不断增长的计算需求。条件数据移动(Conditional data move)和数据缓存预取(prefetch)指令被引入,以期提高通信及多媒体应用的数据吞吐量。固定浮点DSP型指令可进一步增强多媒体处理能力。这些新指令,包括乘法、乘加、乘减和“前导计数(count leading)0s/1s”,在处理音频、视频和多媒体等数据流时,无需在系统中增加额外的DSP硬件即可提供更高的性能。功能强大的浮点指令可加快某些任务的执行速度,比如一些DSP算法的处理、图形操作的实时计算。浮点操作可选择软件仿真。最后,为简化系统集成任务,MIPS32标准定义EJTAG(增强型JTAG)选项功能作为非入侵式、片上实时调试系统。 MIPS64®架构刷新了64位MIPS-Based™嵌入式处理器的性能标准。它代表着下一代高性能MIPS®处理器的基础,并兼容MIPS32®32位架构。MIPS架构拥有强大的指令集、从32位到64位的可扩展性、广泛可获得的软件开发工具以及众多MIPS科技公司授权厂商的支持,是领先的嵌入式架构。MIPS64架构是以前的MIPS IV™ 和 MIPS V™指令集架构(ISA)的扩展集,整合了专门用于嵌入式应用的功能强大的新指令,以及以往在R4000® 和 R5000® MIPS处理器中执行的已经验证的存储器管理和特权模式控制机制。通过整合强大的新功能、标准化特权模式指令、支持前代ISA,以及提供从MIPS32架构升级的路径,MIPS64架构为未来基于MIPS处理器的开发提供了一个坚实的高性能基础。

MIPS64架构基于一种固定长度的定期编码指令集,并采用导入/存储(load/store)数据模型。经改进,这种架构可支持高级语言的优化执行。其算术和逻辑运算采用三个操作数的形式,允许编译器优化复杂的表达式。此外,它还带有32个通用寄存器,让编译器能够通过保持对寄存器内数据的频繁存取进一步优化代码的生成性能。

这种架构从R4000/R5000类处理器衍生出特权模式异常处理和存储器管理功能。它采用一组寄存器来反映缓存器、MMU、TLB及各个内核中实现的其它特权功能的配置。MIPS32架构的兼容模式让32位代码无需修改即可在MIPS64上运行。通过提供后向兼容性、对特权模式和存储器管理进行标准化,并经由配置寄存器提供信息,MIPS64架构能够使实时操作系统和应用代码同时被执行,并在MIPS32和MIPS64处理器系列的各个产品之间复用。

高性能缓存器及存储器管理方案的灵活性仍继续成为MIPS架构的一大优势。MIPS64架构利用定义良好的缓存控制选项功能进一步扩展了这种优势。指令和数据缓存器的大小可以从256byte到4Mbyte。数据缓存可采用回写或直写策略。无缓存也是可选配置。存储器管理机制可以采用TLB或块地址转换(BAT)策略。利用TLB,MIPS64架构可满足Windows CE和Linux的存储器管理要求。

由于增加了数据流和断言操作(predicated operations),可满足嵌入式市场不断增长的计算需求。条件数据移动和数据预取指令被标准化,以提高通信及多媒体应用的系统级数据吞吐量。

固定浮点DSP型指令可进一步增强多媒体处理能力。这些以前只有在某些64位MIPS处理器上才使用的指令,包括乘法(MUL)、乘加(MADD)、乘减(MSUB)和“前导计数(count leading) 0s/1s”,在处理音频、视频和多媒体等数据流时,无需在系统中增加额外的DSP硬件即可提供更高的性能。

功能强大的64位浮点寄存器和执行单元可加快某些任务的执行速度,比如一些DSP算法的处理、图形操作的实时计算。双单精度指令(Paired-Single instruction)在一个64位寄存器中装入了两个32位浮点操作数,从而实现单指令多数据操作(SIMD)。这种方法的执行速度是传统32位浮点单元的两倍。浮点操作可选择软件仿真。

MIPS64架构兼具32位和64位寻址模式,同时采用64位数据工作。这样一来,无需额外的存储器进行64位寻址就能获得64位数据的优势。为了便于从32位系列的移植,该架构还带有32位兼容模式,在这种模式中,所有寄存器和地址都是32位宽,MIPS32架构中出现的所有指令都被执行。 microMIPS™是一种在单个统一的指令集架构中集成了16位和32位优化指令的高性能代码压缩技术。它支持MIPS32® 和MIPS64® Release 2架构,整合了可变长度重新编码MIPS指令集和新增的代码量优化16位和32位指令,可提供高性能和高代码密度。

microMIPS是一个完整的ISA,既能单独工作,也能与原有的MIPS32兼容指令解码器共同工作,允许程序混合16位和32位代码,无需模式切换。microMIPS的程序代码量较小,因此可获得更好的缓存利用率和更小的取指带宽(fetch bandwidth),从而有助于提升性能,降低功耗。

microMIPS包含所有MIPS ASE指令,支持CorExtend™/UDI接口。而且,针对microMIPS软件及系统开发,MIPS科技公司与第三方合作伙伴生态系统提供有一套全面完善的软硬件工具支持。新推出的M14K™和 M14Kc™是首先执行 microMIPS的处理器内核。

linux prefetch()的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux prefetch(),Linux prefetch函数的作用及使用方法简介,linux怎么查看tlb miss,MIPS架构的体系分类的信息别忘了在本站进行查找喔。


数据运维技术 » Linux prefetch函数的作用及使用方法简介 (linux prefetch())