Это может показаться бессмысленным, но у меня возникают проблемы с оптимизацией фрагмента кода C ++ для нескольких процессоров и кэша.
Кеш важнее многих процессоров: я перебираю 2 вложенных цикла
for(int i=0; i<n; i++){
//do a little something here with a single array
for(int j=0; j<whoaAnotherArray[n].size(); j++){
* access array[i][j] and otherArray[i][j] and store in a variable
- an example is: "int x = array[i][j] + otherArray[i][j]"
* compare variable to some other array[index calculated from i and j]
- an example is: "if (x < yetAnotherArray[i*n+j]){ //do something to yetAnotherArray }"
}
}
Мои массивы (array и otherArray) имеют очень большой размер. п их размер.
Есть ли способ сделать этот кеш более дружественным? Я уже перешел от использования связанных списков, которые ужасны для кеша. Я где-то читал, что мой порядок доступа [i] [j] также эффективен для кэширования.
FWIW, это часть алгоритма обнаружения цикла с отрицательным весом.
Я подумал, может быть, поскольку мои массивы такие огромные (кстати, это массивы целых чисел), было бы лучше разбить их немного, чтобы они лучше помещались в кеше? Но я не уверен, правильно ли это или нет, как это сделать.
Я также начал использовать openmp. Единственное, что я делал, это добавляю
#pragma omp parallel for
раньше, чем право на петли, и я получаю приличное использование. Я хотел бы узнать, как лучше использовать параллелизм, но за пределами цикла в моем коде, я не уверен, что я могу сделать. И все время: я пытаюсь быть дружелюбным к кешу.