@woodyJS

Параллельное программирование, на какие операции разбить?

Добрый день, требуется написать послед. и параллельные версии программы которая решает слау методом квадратных корней.
Написал послед. и уже долго сижу думаю, как ее распараллелить. Ведь, чтобы перейти к след шагу решения нужно дождаться результатов предыдущего шага.
фрагмент кода, где идет вычисление решения.
// A = U(t)*U, далее находим U and U(t)
            double temp;
            double[,] U = new double[n, n];      
            for(int i=0;i<n;i++)
                for (int j=0;j<n;j++)
                {
                    U[i, j] = 0;
                }
            for (int i = 0; i < n; i++)
            {
                temp = 0;
                for (int k=0;k<i;k++)
                    temp = temp + Math.Pow(U[k, i], 2);
                U[i, i] =Math.Sqrt(A[i, i] - temp);
                for (int j = i; j < n; j++)
                {
                    temp = 0;
                    for (int k = 0; k < i; k++)
                        temp = temp + U[k, i] * U[k, j];
                    U[i, j] = (A[i, j] - temp) / U[i, i];
                    
                }
                
            }
            for (int i = 0; i<n;i++)
            {
                for (int j=0; j < n; j++)
                {
                    Console.Write("{0} ", U[i, j]);
                }
                Console.WriteLine();
            }


            double[] x = new double[n];
            double[] y = new double[n];
           
            for (int i=0;i<n;i++)
            {
                temp = 0;
                for(int k=0;k<i;k++)               
                    temp = temp + U[k, i] * y[k];
                y[i] = (b[i] - temp) / U[i, i];
            }
            for(int i=n-1;i>=0;i--)
            {
                temp = 0;
                for (int k = i + 1; k < n; k++)
                    temp = temp + U[i, k] * x[k];
                x[i] = (y[i] - temp) / U[i, i];
            }
            for (int i = 0; i < n; i++)
                Console.Write("{0} ", x[i]);
            Console.WriteLine();
  • Вопрос задан
  • 231 просмотр
Решения вопроса 1
@tomatho
В первую очередь параллель это:
for (int k = 0; k < i; k++)
    temp = temp + U[k, i] * U[k, j];

Просто разбей диапазон значений j на M ядер.
Проще всего так. Если у нас есть N операций, и мы хотим разбить на M ядер то это (N+M-1)/M с округлением вниз операций на ядро.
Update: Не всё так просто как мне казалось, в общем, это не ответ.

Можно другие попробовать распараллелить, но это это самая ресурсоёмкая часть.
Вообще хорошо гуглится описание распараллеливания этого алгоритма.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы