в книге «Использование OpenMP» приведен пример плохого доступа к памяти в C, и я думаю, что это главная проблема в моей попытке распараллелить алгоритм Гаусса.
Пример выглядит примерно так:
k= 0 ;
for( int j=0; j<n ; j++)
for(int i = 0; i<n; i++)
a[i][j] = a[i][j] - a[i][k]*a[k][j] ;
Итак, я понимаю, почему это вызывает плохой доступ к памяти. В C массив 2d хранится по строкам, и здесь на каждом шаге i новая строка будет скопирована из памяти в кеш.
Я пытаюсь найти решение для этого, но я не получаю хорошей скорости. Эффект от моих попыток незначительный.
Может ли кто-нибудь дать мне подсказку, что я могу сделать?
Самый простой способ - поменять местами циклы for, но я хочу сделать это по столбцам.
Вторая попытка:
for( int j=0; j<n-1 ; j+=2)
for(int i = 0; i<n; i++)
{
a[i][j] = a[i][j] - a[i][k]*a[k][j] ;
a[i][j+1] = a[i][j+1] - a[i][k]*a[k][j+1] ;
}
вообще не имело значения.
Третья попытка:
for( int j=0; j<n ; j++)
{
d= a[k][j] ;
for(int i = 0; i<n; i++)
{
e = a[i][k] ;
a[i][j] = a[i][j] - e*d ;
}
}
Большое спасибо
Приветствует Степп
for
петель? - person ire_and_curses   schedule 24.02.2011