优化嵌套数组值的代码

时间:2016-02-15 16:59:30

标签: c arrays caching openmp cpu

我正在寻找一种优化代码的最佳实践解决方案,该代码适用于嵌套数组。一个数组的值用作第二个数组的索引。我认为当前代码不是cpu缓存友好代码。我可以使用openmp来优化此代码的性能吗?如果是,如果PICK不是很好10,那么最好使用“for”或“sections”?

#define bino4d(a,b,c,d) (base1[a]+base2[b]+base3[c]+base4[d])

static unsigned char _bits_[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
#define TSTBIT(ch,i) (ch[(i)>>3] & _bits_[(i) & 0x07])

lpmax = (PICK*(PICK - 1)*(PICK - 2)*(PICK - 3)) / 24;

    for (lp = 0; lp < lpmax; lp++)
    {

        j0 = I[LP4_0[lp]];
        j1 = I[LP4_1[lp]];
        j2 = I[LP4_2[lp]];
        j3 = I[LP4_3[lp]];
        ul = j0 + j1 + j2 + j3;

        //j0 = LP4_0[lp];
        //j1 = LP4_1[lp];
        //j2 = LP4_2[lp];
        //j3 = LP4_3[lp];
        //ul = bino4d(I[j0], I[j1], I[j2], I[j3]);
        if (TSTBIT(ToCover, ul)) s4++;
    }

1 个答案:

答案 0 :(得分:1)

通过使用额外的数组来存储ul的部分结果,您可以使计算更加局部化并实现更好的缓存友好性或实现并行性。假设我们有一个数组UL[lpmax]=0

for (lp = 0; lp < lpmax; lp++)
    UL[lp] += I[LP4_0[lp]];

for (lp = 0; lp < lpmax; lp++)
    UL[lp] += I[LP4_1[lp]];

for (lp = 0; lp < lpmax; lp++)
    UL[lp] += I[LP4_2[lp]];

for (lp = 0; lp < lpmax; lp++)
    UL[lp] += I[LP4_3[lp]];

for (lp = 0; lp < lpmax; lp++)
    if (TSTBIT(ToCover, UL[lp])) s4++;