可移植显式预取
Portable explicit prefetch
我需要一种简单且可移植的方法来显式预取数据。我不想使用任何特定编译器或平台的特定功能,只想使用足够通用的功能来跨不同的平台和编译器工作。
脑海中出现的一个非常天真的解决方案是,只需将一个字节/int从内存位置移动到一个寄存器,就可以"应该"将该内存段带到CPU缓存中以填充一行,至少这是我逻辑上的假设。但也许事情不会那么容易?一种可能性是,如果没有在特定范围内访问数据,编译器可以优化操作,因此不会发生预取。
一般来说,预取和内存加载并不是完全相同的操作。有几个基本区别:
- 预取无效地址不会产生故障,而尝试读取、写入或执行无效地址会产生故障(当然,如果CPU有MPU/MMU)
- 预取可以用于读取和/或写入,而仅仅将字节读取到寄存器中就是将字节读取寄存器中
- 您可以(理论上)在预取时指定内存位置
- CPU可能具有与内存加载指令不同的用于预取的特殊指令
所以只需使用__builtin_prefetch
,让编译器来完成艰苦的工作。
此外,请记住,优化编译器可能会自动生成预取指令。我想如果他们这样做了,那么你就必须确保你不会干涉。
另一件有趣的事情是,通常情况下,显式预取不会提高性能,反而会略微降低性能。请参阅LWN的这篇文章,了解从Linux内核中完全删除预取的详细信息和解释。
希望能有所帮助。祝你好运
相关文章:
- C++Union/Struct位域的实现和可移植性
- 具有Qt事件循环的可移植通用共享库设置
- 没有执行策略的 std::transform_reduce 是可移植的吗?
- 如何在 c++ 中正确指定 #include 路径以使程序可移植
- 创建异构顶点数据数组的可移植方法
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- 静态库可移植性
- 从非类型模板参数声明 constexpr 数组的可移植方法
- C++:Unicode 字符串文字的可移植性
- 如何使Visual Studio 2017 C++项目在计算机之间更具可移植性
- 尝试将 sfml 和 c++ 与 Windows 10 上的可移植 vscode 链接起来
- 在C++中获取命名空间名称的任何可移植技巧
- STR这个实现是否安全且可移植?
- 编写 std::copysign 的可移植 SSE/AVX 版本
- 是可移植的包装结构
- 将参数推送到调用堆栈 (C++) 的可移植方法
- 在为视频游戏实施基本的二进制序列化时,请担心可移植性
- 如何以可移植方式删除名称为 wchar_t 类型的文件C++
- Xcode 8.3.2 中的错误警告:文件的非可移植路径 - 指定的路径与磁盘上的文件名不同
- 可移植显式预取