考虑一些内存和 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/