go - 是否可以在 Golang 中使用 CPU 缓存?

标签 go

考虑一些内存和 CPU 密集型任务:
例如:任务 block :从内存中读取 16 个字节,然后执行 CPU 作业。然后写回内存。
而且这个任务 block 可以并行化,这意味着每个内核可以运行一个任务 block 。
例如:8个CPU同时需要8*16字节缓存。

最佳答案

是的,就像您机器上运行的所有其他代码一样,它们都使用 CPU 缓存。

这个问题太宽泛了,无法告诉您如何编写应用程序代码以使其最有效地使用缓存。我强烈建议设置 Go Benchmarks,然后重构代码并比较时间。 (请注意,不要在 VM 内进行基准测试 - VM 和任何平台上的类型都没有足够准确的时钟来进行 Go 的基准测试。运行所有 native 操作系统的基准测试,而不是 VM)。

这一切都取决于您对应用程序进行编码以高效利用 CPU 缓存的能力。这是一个更广泛的主题,涉及如何使用变量、更新它们的频率、保留在堆上或在堆栈上获取 GC 的内容以及频率等。

一个小例子可以为您指明正确的方向,以阅读有关高效的 L1 和 L2 缓存开发的更多信息...

L1 缓存使用 64 位行。如果您想存储 4 个 16 位 Int16,通常它们将分配在堆栈上,并且很可能全部存储在缓存的同一行中。

假设您要更新其中一个 Int16?好吧,CPU 缓存无法更新部分行:它必须使整行无效,并使用之前的 3 个 Int16 和您的新更新值分配一个全新的缓存行。

非常低效。

该问题的一个解决方案是使用 Int64s,CPU 缓存只会使 1 行无效,但会将其他 3 行保留在缓存中以便快速读取。你是在做更多的推还是流行?等

同样,这在很大程度上取决于您的用例:如果您使用这 4 个整数的大量上下文切换(例如互斥锁),这甚至可能会减慢速度。在这种情况下,这是一个需要优化的完全不同的问题。

我建议阅读有关堆栈和堆上的高频缩放和内存分配的内容。

关于go - 是否可以在 Golang 中使用 CPU 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36526027/

相关文章:

go - 如何导入vscode路径

rest - 在go中停止处理http请求

go - 如何使用 Golang 从一个函数返回不同类型的结构?

去如何检查一个函数是否存在

go - Go中如何将包含非数字字符的字符串拆分为字符串数组?

amazon-web-services - AWS SDK 是否自动处理 session 过期?

regex - 如何匹配彼此相邻的括号?

go - 缓冲/非缓冲 channel 和死锁

go - 如何存储一片 byte slice ?

json - 反序列化为 map[string]interface{} 作为具体的 map 类型