数组结构和缓存关联性

时间:2015-01-30 15:13:18

标签: c++ performance algorithm

在缓存一致性方面更快/更好的是什么?第一种情况是一个结构数组,其元素一起使用(请注意,我使用了10000个元素来表示它是关于大数字。但是,确切的元素数量不是一个小修道院,因此使用动态数组):

struct physics
{
    float3 position;
    float3 velocity;
    float3 acceleration;
    float  mass;
};
std::vector<physics> rigidBodies(10000);
void simulate(float dt)
{
    // for each rigid body [i] calculate
    // position += velocity*dt + 0.5*acceleration*dt*dt;
    // force = acceleration * mass;
    // note that struct members are used together.
}

第二种情况是数组结构:

struct physics
{
    std::vector<float3> position(10000);
    std::vector<float3> velocity(10000);
    std::vector<float3> acceleration(10000);
    std::vector<float>  mass(10000);
};
void simulate(float dt)
{
     // for each element [i] in physics calculate
     // position[i] += velocity[i]*dt + 0.5*acceleration[i]*dt*dt;
     // force[i] = acceleration[i]*mass[i];
}

在这两种情况下,数据都紧密打包,但在第二种情况下,每个std::vector在不同的位置分配内存,这可能导致缓存关联性冲突未命中。但是,许多程序员(mostly in game development)建议使用第二种情况。我已经阅读了关于记忆的This excellent paper,但我还不清楚哪种方法更好。

0 个答案:

没有答案