繁体   English   中英

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

[英]Is it possible to use CPU cache in Golang?

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

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

要告诉您如何对应用进行编码以使其最有效地使用缓存,这是一个非常广泛的问题。 我强烈建议设置Go Benchmarks,然后重构代码并比较时间。 (注意,不要在虚拟机中进行基准测试 - 虚拟机和任何平台上的类型,没有足够准确的时钟用于Go的基准测试。运行所有基准测试,而不是虚拟机)。

这一切都归结为您对应用程序进行编码以有效利用 CPU缓存的能力。 这是一个更广泛的主题,关于如何使用变量,它们更新的频率,堆栈上的内容或堆栈中的GC以及频率等等。

一个很小的例子,指出你正确的方向,阅读更多关于有效的L1和L2缓存开发......

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

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

非常低效。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM