作为我正在使用的算法(倾向于使用SMP)的新变体的一部分,我正在考虑将particle
s排序为box
es,让每个box
拥有一个particle* []
。我唯一担心的是,由于每个盒子的粒子数量可能会有所不同,(在非常罕见的情况下,平均10个粒子的数量已经高达70),我需要大量分配指针数组。我想的可能是5-10%的利用率。
极端情况会有大约一百万个,所以我们考虑分配内存的半GB。就它将运行的机器而言,这不是一个问题,但我想知道是否存在与大步跨越相关的性能损失(缓存恨它或其他东西)。 (例如,访问500中的前60个字节)。 我知道要确保我的步幅宽度不会最终成为64的缓存破坏倍数...
我很乐意在非常罕见的情况下让它失败,只要这个计划能够获得足够的性能提升,以便能够在相同的时间内运行更成功的副本。
如果它是相关的,这个代码将主要在Xeon E5620上运行,虽然这会改变,我宁愿不做任何特定于架构的。
编辑:这是将连续内存中的N个字节的打包数据与在更大的连续内存区域上均匀跨越的N个字节数据进行比较。
答案 0 :(得分:5)
如果您分配的内存不会导致交换,只需将其分配就不会产生任何额外的开销。
但是,如果您的算法当前将数据点打包到连续的内存中,并且您的新算法会在整个分配的缓冲区上传播5%-10%的利用率(如果情况不明确,那么您的问题就不清楚了)更多缓存未命中访问内存。
另一方面,如果每个CPU有一个缓冲区(并且使用连续内存),由于false sharing的机会减少,您的算法可能会表现得更好。