__builtin_xxx指令学习【2】__builtin_prefetch

这篇具有很好参考价值的文章主要介绍了__builtin_xxx指令学习【2】__builtin_prefetch。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

__builtin_prefetch是GCC编译器提供的一个内置函数,用于预取数据到CPU的缓存中,以便提高程序的执行效率。它的语法如下:

__builtin_prefetch (const void *addr, int rw, int locality)

其中,addr是一个指向要预取数据的地址的指针,rw是一个表示读写属性的整数,locality是一个表示预取数据的局部性的整数。__builtin_prefetch的返回值是void类型,它只是告诉CPU预取数据到缓存中,而不会等待数据被加载到缓存中。

__builtin_prefetch的使用背景是,现代CPU的缓存系统可以预取数据到缓存中,以便提高程序的执行效率。但是,如果预取的数据与程序的执行流程不符,就会导致CPU的缓存被清空,从而降低程序的执行效率。因此,为了让CPU的缓存预取机制更加准确,我们可以使用__builtin_prefetch来告诉CPU要预取哪些数据,从而让CPU的缓存预取机制更加准确。

__builtin_prefetch的内部原理是,它会向CPU发送一个预取数据的请求,然后CPU会将请求加入到预取队列中。当CPU空闲时,它会从预取队列中取出请求,并将请求的数据预取到缓存中。

每次抓多少是有具体的CPU实现决定的,但是至少会抓32字节。

下面是一个demo,在求和前,先预取下一部分数据。

需要注意的是访问数组p的当前元素时,CPU已经开始预取下一个元素的数据,所以不要使用p[i+1]。另外,预取的数据的距离也应该根据程序的执行流程和数据访问模式来选择。如果预取的数据距离当前元素太远或者太近,都会导致程序的执行效率降低。在这个示例代码中,我们使用了p[i + 100]来预取下一个元素的地址,100是一个经验值,可以根据具体情况进行调整。

#include <iostream>
#include <chrono>

int main() {
    int* p = new int[100000000];
    for (int i = 0; i < 100000000; ++i) {
        p[i] = i;
    }
    auto start = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < 100000000; ++i) {
        __builtin_prefetch(&p[i + 100]);
        p[i] += 1;
    }
    auto end = std::chrono::high_resolution_clock::now();
    std::cout << "Time: " << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "ms\n";
    delete[] p;
    return 0;
}
[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 224ms
[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 217ms
[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 234ms
[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 233ms
[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 238ms
[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 216ms

如果不使用__builtin_prefetch,耗时如下,提升效果还是挺明显的

[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 269ms
[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 302ms
[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 309ms
[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 251ms
[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 244ms
[hanhandi@VM-33-162-centos ~/hanhan_CppScripts/test]$ ./test 
Time: 270ms

需要注意的是:

如果预取的数据与程序的执行流程不符,就会导致CPU的缓存被清空,从而降低程序的执行效率。

此外,如果预取的数据过多,就会导致CPU的缓存被占满,从而降低程序的执行效率。

如果编译器已经对程序进行了优化,那么使用__builtin_prefetch指令可能会导致程序的执行效率降低。

因此,需要根据程序的执行流程和数据访问模式来合理使用__builtin_prefetch,以便提高程序的执行效率。文章来源地址https://www.toymoban.com/news/detail-407974.html

到了这里,关于__builtin_xxx指令学习【2】__builtin_prefetch的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【git push指令提交项目报错】 fatal: unable to access ‘https://github.com/xxxxx/xxx.git/‘: OpenSSL SSL_read: Co

    问题一: 问题二: 两个问题都可以以下尝试 1. 关闭网络代理(比如关闭网络代理等vpn), 2.所连网络是校园网等内网,没有权限访问github网站(可以直接点击github官网测试一下),如果确实无法访问,直接连手机热点就可以。 另附git提交指令:

    2024年02月16日
    浏览(75)
  • R语言【cli】——builtin_theme():内置的CLI主题

    Package  cli  version 3.6.0 此主题始终处于活动状态,并且位于主题堆栈的底部。 参数【dark】 :是否使用黑暗主题。cli.theme_dark选项可用于显式请求暗主题。如果没有设置,或者设置为“auto”,那么cli会尝试检测暗主题,这在最近的RStudio版本和macOS上的term中都有效。 一个命名

    2024年01月25日
    浏览(65)
  • 【ARM 嵌入式 编译系列 5 -- GCC 内建函数 __builtin 介绍】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 下篇文章:ARM 嵌入式 编译系列 6 – GCC objcopy, objdump, readelf, nm 介绍 GCC提供了一些专门的功能,用于访问特定的硬件指令或者实现特定的优化,它们被称为\\\" __builtin \\\"函数。 这些

    2024年02月13日
    浏览(61)
  • 【ARM 嵌入式 编译系列 5 -- GCC 内建函数 __builtin 详细介绍】

    请阅读 【ARM GCC 编译专栏导读】 上篇文章:ARM 嵌入式 编译系列 4.2 – GCC 链接规范 extern “C“ 介绍 下篇文章:ARM 嵌入式 编译系列 6 – GCC objcopy, objdump, readelf, nm 介绍 GCC提供了一些专门的功能,用于访问特定的硬件指令或者实现特定的优化,它们被称为\\\" __builtin \\\"函数。 这些

    2024年02月13日
    浏览(60)
  • 【ARM64 常见汇编指令学习 13 -- ARM 汇编 ORG 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 下篇文章:ARM64 常见汇编指令学习 14 – ARM 汇编 .balign,.balignw,.balign 伪指令学习 在ARM汇编中,\\\" org \\\"是一个汇编器伪指令,用于设置下一条指令的装入地址。\\\" org \\\"后面跟着的是一个表达式,这个表达式的值就是下一条

    2024年02月14日
    浏览(46)
  • 【ARM 常见汇编指令学习 7 - LDR 指令与LDR伪指令及 mov指令】

    上篇文章:ARM 常见汇编指令学习 6 - bic(位清除), orr(位或), eor(异或) 下篇文章:ARM 常见汇编指令学习 8 - dsb sy 指令及 dsb 参数介绍 LDR指令 与 LDR伪指令 两者虽然名字相同但是作用却不相同,区分两者的方法就是看第二个参数,如果有等号,就是LDR伪指令。 LDR 指令 上面语句的

    2024年02月14日
    浏览(56)
  • pytorch+GPU跑模型时 nvrtc: error: failed to open nvrtc-builtins64_117.dll

    1. 先检查自己cuda版本: 如果版本高于11建议先降版本,然后再试下。 2. 重新安装nvrtc-builtins64_117.dll 下载缺失文件 拷贝到指定目录C: Windows System32 点击运行即可 3. 文件已上传到资源,文章顶部可见

    2024年02月14日
    浏览(36)
  • 【ARM64 常见汇编指令学习 14 -- ARM 汇编 .balign,.balignw,.balign 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 下篇文章:ARM64 常见汇编指令学习 15 – ARM 标志位的学习 .balignl 是一个伪操作符,伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是编译器来实现其功能的。. balignl 是 .balign 的变体。 .balignl 完整

    2024年02月14日
    浏览(40)
  • python报错:argument 1 must be pygame.surface.Surface, not builtin_function_or_method解决方法

    1、报错分析 : 根据报错信息,提示我们出错的原因在与第一个参数类型必须是pygame类型,但是我们的参数类型不匹配。 2、源码分析 这里的方法blit()中的第一个参数是STATICSURF,一个全局常量。根据报错我们知道是它出了问题。我们找到这个参数的赋值代码。 3、STATICSURF参数

    2024年02月12日
    浏览(52)
  • 【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】

    上篇文章:ARM64 常见汇编指令学习 15 – ARM64 标志位的学习 下篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 在ARMv8架构中,同步异常主要包括以下几种: Undefined Instruction :未定义指令异常,当处理器尝试执行一条未定义的指令时会触发。 Supervisor Call (SVC) :这是一种特殊

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包