2016-02-15 1 views
-1

Я ищу оптимальное решение для оптимизации кода, который работает с вложенными массивами. Значение из одного массива используется как индекс для второго. Я думаю, что текущий код не является дружественным кэш-кодом. Могу ли я использовать openmp для оптимизации производительности этого кода? Если да, то что лучше использовать «для» или «секций», если PICK не большой 10?Оптимизируйте код для значений вложенных массивов

#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++; 
    } 
+0

что размер I и что диапазон LP4_ * – user3528438

+0

LP4_ * диапазон равен 210. Для этого примера кода PICK = 5 –

ответ

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++; 
+0

Интересный Ideia. Я проверю его. –