- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将在 GNU 汇编程序 (GAS) 中为 Linux x86-64(特别是我 table 上的 AMD Ryzen 9 3900X)编写自己的 FORTH“引擎”。
(如果成功,我可能会用类似的想法为复古6502和类似的自制电脑制作固件)
我想添加一些有趣的调试功能,例如将编译代码的注释保存在带有附加字符串的“NOP words”中,这在运行时不会做任何事情,但是当反汇编/打印出已经定义的单词时,它会打印那些评论也一样,所以它不会丢失所有标题(a b - c)和评论(这里有这个特殊的小技巧)我将能够尝试用文档定义新词,然后以某种不错的方式打印所有定义并从中创建新的图书馆,我认为这很好。 (并且已经切换到忽略“生产发布”的评论)
我在这里阅读了太多关于优化的内容,但我无法在几周内理解所有这些内容,所以我将推出微优化,直到它遇到性能问题,然后我将开始分析。
但我想至少从体面的架构决策开始。
我目前的理解:
因为有很多“堆”在增长(好吧,没有使用“免费”,所以它也可能是堆栈,或者堆栈在增长)(还有两个堆栈在向下增长)我不确定如何实现它,因此 CPU 缓存将以某种方式适本地覆盖它。
我的想法是使用一个“大堆”(并在需要时用 brk() 增加它),然后在其上分配大块的对齐内存,在每个 block 中实现“小堆”并将它们扩展到另一个大堆当旧的填满时分块。
我希望,缓存会自动获得最常用的 block ,首先在大部分时间保留它,而较少使用的 block 将大部分被缓存忽略(相应地,它只会占据一小部分并被读取并全部踢出时间),但也许我没做对。
但也许对此有更好的策略?
最佳答案
进一步阅读的第一站应该是:
so I will put out microoptimalisation until it will suffer performance problems and then I will start with profiling.
是的,开始尝试可能很好,这样您就可以使用 HW 性能计数器进行分析,这样您就可以将您正在阅读的有关性能的内容与实际发生的事情相关联。因此,在您过度优化整体设计理念之前,您会获得一些您尚未想到的可能细节的想法。您可以从一些非常小规模的东西开始学习很多关于 asm 微优化的知识,比如某个地方没有任何复杂分支的单个循环。
由于现代 CPU 使用分离的 L1i 和 L1d 缓存以及一级 TLB,因此将代码和数据放在一起并不是一个好主意。 (尤其不是读写数据;自修改代码由 flushing the whole pipeline on any store too near any code that's in-flight anywhere in the pipeline 处理。)
相关:Why do Compilers put data inside .text(code) section of the PE and ELF files and how does the CPU distinguish between data and code? - 他们没有,只有经过混淆的 x86 程序才会这样做。 (ARM 代码有时会混合代码/数据,因为 PC 相关负载在 ARM 上的范围有限。)
是的,确保您所有的数据分配都在附近应该有利于 TLB 局部性。硬件通常使用伪 LRU 分配/逐出算法,该算法通常可以很好地将热数据保存在缓存中,通常不值得尝试手动 clflushopt
任何东西来帮助它。软件预取也很少有用,尤其是在数组的线性遍历中。如果您知道稍后要访问的位置,那么这样做有时是值得的,但 CPU 无法轻易预测。
AMD 的 L3 缓存可能会使用 adaptive replacement喜欢Intel does , 试图保留更多被重用的行,而不是让它们被那些往往不会被重用的行轻易驱逐。但是 Zen2 的 512kiB L2 以 Forth 标准比较大;您可能不会有大量的二级缓存未命中。 (并且无序执行可以做很多事情来隐藏 L1 未命中/L2 命中。甚至隐藏 L3 命中的一些延迟。)当代 Intel CPU 通常使用 256k L2 缓存;如果您是通用现代 x86 的缓存阻塞,128kiB 是一个不错的 block 大小选择,假设您可以写入然后在获得 L2 命中时再次循环。
在像 Zen2 ( https://en.wikichip.org/wiki/amd/microarchitectures/zen_2#Architecture ) 或 Skylake 这样的现代 x86 上,L1i 和 L1d 缓存(每个 32k),甚至 uop 缓存(高达 4096 微指令,每条指令大约 1 或 2),与第四实现;可能大部分时间所有内容都会命中 L1 缓存,当然还有 L2。是的,代码局部性通常很好,但是 L2 缓存比典型 6502 的整个内存还多,您真的不必担心太多 :P
解释器更关心的是分支预测,但幸运的是 Zen2(以及自 Haswell 以来的英特尔)有 TAGE 预测器,即使只有一个“大中央调度”分支,它也能很好地学习间接分支的模式:Branch Prediction and the Performance of Interpreters -Don’t Trust Folklore
关于assembly - AMD64 缓存优化策略 - 堆栈、符号、变量和字符串表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67841704/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!