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

时间:2016-04-10 05:05:31

标签: go

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

非常低效。

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

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

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