Распараллеливание метода Якоби - C#
Формулировка задачи:
Помогите пожалуйста распараллелить функцию Якоби для решения СЛАУ.
Я вообще ничего не понимаю в параллелизме
Сам попытался, но мне кажется, что так делать неправильно.
static void Jacobi1(int N, double eps, double[,] A, double[] F, double[] X)//Последовательная функция
{
double[] TempX = new double[N];
while(true)
{
for (int i = 0; i < N; i++)
{
TempX[i] = F[i]; // Инициализируем i-ую неизвестную значением свободного члена i-ой строки матрицы
for (int j = 0; j < N; j++) // Вычитаем сумму по всем отличным от i-ой неизвестным
{
if (i != j)
TempX[i] -= A[i, j] * X[j];
}
TempX[i] /= A[i, i];// Делим на коэффициент при i-ой неизвестной
}
double error = 0.0;
for (int i = 0; i < N; i++)
{
error += Math.Abs(TempX[i]- X[i]);
}
if (error < eps)
{
break;
}
for (int h = 0; h < N; h++)
{
X[h] = TempX[h];
}
}
Console.Write("\nРешения СЛАУ:");
for (int i = 0; i < N; i++)
{
Console.Write("\n");
Console.Write("X[{0}",i+1);
Console.Write("]=");
Console.Write("{0,-5}", X[i]);
}
}static void Jacobi2(int N, double eps, double[,] A, double[] F, double[] X)
{
double[] TempX = new double[N];
while (true)
{
Parallel.For(0, N, i =>
{
TempX[i] = F[i]; // Инициализируем i-ую неизвестную значением свободного члена i-ой строки матрицы
Parallel.For(0, N, j =>
{// Вычитаем сумму по всем отличным от i-ой неизвестным
if (i != j)
TempX[i] -= A[i, j] * X[j];
});
TempX[i] /= A[i, i];// Делим на коэффициент при i-ой неизвестной
});
double error = 0.0;
Parallel.For(0, N, i =>
{
error += Math.Abs(TempX[i] - X[i]);
});
if (error < eps)
{
break;
}
Parallel.For(0, N, h =>
{
X[h] = TempX[h];
});
}
for (int i = 0; i < N; i++)
{
Console.Write("\n");
Console.Write("X[{0}", i + 1);
Console.Write("]=");
Console.Write("{0,-5}", X[i]);
}
Console.ReadLine();
}Решение задачи: «Распараллеливание метода Якоби»
textual
Листинг программы
static void Jacobi2(int N, double eps, double[,] A, double[] F, double[] X)//Последовательная функция
{
double[] TempX = new double[N];
var locker = new object();
while (true)
{
double error = 0.0;
Parallel.For(0, N, i =>
{
TempX[i] = F[i]; // Инициализируем i-ую неизвестную значением свободного члена i-ой строки матрицы
for (int j = 0; j < N; j++) // Вычитаем сумму по всем отличным от i-ой неизвестным
{
if (i != j)
TempX[i] -= A[i, j] * X[j];
}
TempX[i] /= A[i, i];// Делим на коэффициент при i-ой неизвестной
lock (locker)
error += Math.Abs(TempX[i] - X[i]);
});
if (error < eps)
{
break;
}
X = TempX.ToArray();
}
Console.Write("\nРешения СЛАУ:");
for (int i = 0; i < N; i++)
{
Console.Write("\n");
Console.Write("X[{0}", i + 1);
Console.Write("]=");
Console.Write("{0,-5}", X[i]);
}
}