Мне интересно, может ли кто-нибудь помочь мне после оптимизации разбиения циклов, чтобы минимизировать ошибки кэширования. Я работаю над умножением четырех чисел с плавающей запятой 4000×4000.
Машина имеет три уровня кэша со значениями: L1 128 КБ, L2 1 МБ и L3 8 МБ
Есть четыре вложенных цикла и не идеально вложенных.
for(int i=0; i<NN; i++) {
for (int j=0; j<NN; j++) {
if (i != j){
thirdlayer = 0;
for (int k=0; k<NN; k++) {
fourthlayer = 0;
for (int l=0; l<NN; l++) {
fourthlayer = fourthlayer + V[j*NN+l]*V[NN+l]*J[k*NN+l];
}
thirdlayer = thirdlayer + V[k]*V[i*NN+k]*fourthlayer;
}
if(pi_cod[j] != 0)
Transitions[i*NN +j] = sqrt(pi_cod[i]*pi_cod[1]/(pi_cod[0]*pi_cod[j]))*Q[i*NN +j]*thirdlayer/Padt;
}
}
}
Задача ещё не решена.
Других решений пока нет …