我已阅读此主题:C# Thread safe fast(est) counter并在我的并行代码中实现了此功能。据我所见,一切正常,但是它显着增加了处理时间,大约增加了 10%。
这一直困扰着我,我认为问题在于我正在对小数据片段执行大量相对便宜(<1 个量子)的任务,这些小数据片段被很好地分割并且可能充分利用了缓存局部性,从而以最佳方式运行。根据我对 MESI 的了解,我最好的猜测是 x86LOCK
前缀Interlocked.Increment
将缓存线推入独占模式并强制其他内核上的缓存未命中并强制在每个并行通道上重新加载缓存,只是为了增加这个计数器。由于缓存未命中的 100ns 延迟和我的工作量,它似乎加起来了。(再一次,我可能是错的)
现在,我看不到解决方法,但也许我遗漏了一些明显的东西。我什至在考虑使用 n 个计数器(对应于并行化程度),然后在特定内核上递增每个计数器,但这似乎不可行(检测我在哪个内核上可能会更昂贵,更不用说复杂的 if/then/else结构并弄乱执行管道)。关于如何打破这个野兽的任何想法?:)