Задать вопрос
@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 К ответам на вопрос (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: Не всё так просто как мне казалось, в общем, это не ответ.

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