我正在考虑通过采用线性数组并将每个元素写入另一个数组中的任意位置(从CPU的角度来看是随机的)来优化程序。我只做简单的写操作,而不是回读元素。
据我所知,对于传统CPU的分散读取可能非常慢,因为每次访问都会导致缓存未命中,从而导致处理器等待。但我认为分散的写入在技术上可能很快,因为处理器不等待结果,因此它可能不必等待事务完成。
遗憾的是,我不熟悉传统CPU内存架构的所有细节,因此可能会出现一些并发症,这可能导致速度非常慢。
有没有人试过这个?
(我应该说我试图反转我遇到的问题。我目前有一个线性数组,我从中读取任意值 - 分散读取 - 由于所有缓存未命中,它非常慢。我的想法是,我可以将此操作转换为分散的写入,以获得显着的速度效益。)
答案 0 :(得分:3)
一般来说,对于尚未在缓存中的地址进行分散写入会给您带来高额罚款,因为您必须为每次写入加载和存储整个缓存行,因此FSB和DRAM带宽要求将远高于顺序写道。当然,每次写入都会导致高速缓存未命中(现代CPU通常会有几百个周期),并且任何自动预取机制都无法提供帮助。
答案 1 :(得分:2)
我必须承认,这听起来很硬。但无论如何我都冒险并回答。
是否可以将输入数组分成页面,并多次读取/扫描每个页面。每次浏览页面时,您只处理(或输出)属于有限数量页面的数据。这样,您只能在每个输入页面循环开始时获得缓存未命中。