Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2011, 19:40   #1
Mumrik
Новичок
Джуниор
 
Регистрация: 28.12.2011
Сообщений: 1
По умолчанию Циклы ParDO

Предмет - параллельное программирование.
Задача - найти циклы ParDO.
Кто-нибудь может объяснить, как их определять?

Теория гласит:
Для того чтобы цикл DO был циклом ParDO по графу G , необходимо и достаточно, чтобы никакая пара точек пространства итераций, соответствующих одним и тем же значениям параметров внешних циклов, но различным значениям параметра рассматриваемого цикла, не была бы связана дугой графа G .
Пусть граф представлен покрывающими функциями вида x=Jy+f , где J - числовая матрица, а вектор f - линейно зависит от внешних переменных цикла. Пусть параметру рассматриваемого цикла соответствуют первые координаты векторов x и y, тогда для того чтобы цикл имел тип ParDO по графу G, достаточно, чтобы граф G был пустым, или для всех покрывающих функций первое равенство в выражениях x1=y1 имело вид .
Если цикл имеет тип ParDo по графу алгоритма, то это означает, что при последовательном исполнении цикла результаты реализации операций, относящихся к разным итерациям цикла, не влияют друг на друга.

От этого не легче(
Код в преобразованном виде:

Код:
I1    DO	 i = 0…n   
I2		DO 	j = 0 … n
F1 			nAij = Jnewi*Jnewj
			END DO
		END DO
F2	gS = 0
F3	SnAS = 0
I3    DO	i = 0 … n	
I4		DO j = 0 … n
F4			nAij = nAij + Aij
			END DO
		END DO
I5    DO	i = 0 … n
I6		DO	j = 0 … n
F5			ggij = gi * gj
			END DO
		END DO
I7   DO	i = 0 … n
F6   		gS =  gS + gi * Si
			END DO
I8   DO	i = 0 … n
I9  		DO	j = 0 … n
F7			ggij = ggij / gS
			END DO
		END DO
I10 DO	i = 0 … n
I11 		DO	 j = 0 … n
F8 			nASi = nASi + nAij*Sj
			END DO
		END DO
I12 DO	i = 0 … n
I13 		DO	j = 0 … n
F9 			nASSij = nASi * Sj
			END DO
		END DO
I14 DO	i = 0 … n
I15 		DO	j = 0 … n
I16 			DO	z = 0 … n 	
F10 				nASSnAij = nASSnAij + nASSiz * nAzj
				END DO
			END DO
		END DO
I17 DO	i = 0 … n
I18 		DO	j = 0 … n
F11 			SnAi = SnAi + Sj * nAij
			END DO
		END DO
I19 DO	i = 0 … n
F12 		SnAS = SnAS + SnAi * Si 	
			END DO
I20 DO	i = 0 … n
I21 		DO	j = 0 … n
F13 			nASSnAij = nASSnAij / SnAS
			END DO
		END DO
I22 DO	i = 0 … n
I23 		DO	j = 0 … n
F14 			Aij =  Aij + ggij - nASSnAij
			END DO
		END DO
В нормальном виде код:
Код:
 //Вычисление A с чертой
                        double[,] nA = new double[n,n];
                        for (int i = 0; i < n; i++)
                            for (int j = 0; j < n; j++)
                                nA[i, j] = Jnew[i] * Jnew[j];

                        // Сумма произведений якобианов и матрицы A
                        for (int i = 0; i < n; i++)
                            for (int j = 0; j < n; j++)
                                nA[i, j] += A[i, j];

                        //Вычисление A(k+1)
                        double[,] gg = new double[n, n];
                        double gS = 0;
                        double[] nAS = new double[n];
                        double[,] nASS = new double[n,n];
                        double[,] nASSnA = new double[n, n];
                        double[] SnA = new double[n];
                        double SnAS = 0;

                        //первая дробь
                        for (int i = 0; i < n; i++) 
                            for (int j = 0; j < n; j++)
                                gg[i, j] = g[i] * g[j];
                        for(int i=0;i<n;i++)    
                            gS+=g[i]*S[i];
                        for (int i = 0; i < n; i++) //отношение
                            for (int j = 0; j < n; j++)
                                gg[i, j] = gg[i, j] / gS;

                        //вторая дробь
                        for (int i = 0; i < n; i++) //числитель
                            for (int j = 0; j < n; j++)
                                nAS[i] += nA[i, j] * S[j];
                        for (int i = 0; i < n; i++)
                            for (int j = 0; j < n; j++)
                                nASS[i, j] = nAS[i] * S[j];
                        for (int i = 0; i < n; i++) //Произведение матриц nxn
                            for (int j = 0; j < n; j++)
                                for(int z = 0; z < n; z++)
                                    nASSnA[i, j] += nASS[i, z] * nA[z, j];
                        for (int i = 0; i < n; i++)//знаменатель
                            for (int j = 0; j < n; j++)
                                SnA[i] += S[j] * nA[j, i];
                        for (int i = 0; i < n; i++)   
                            SnAS += SnA[i] * S[i];
                        for (int i = 0; i < n; i++) //отношение
                            for (int j = 0; j < n; j++)
                                nASSnA[i, j] = nASSnA[i, j] / SnAS;
                        // вычисляем A
                        for (int i = 0; i < n; i++) //отношение
                            for (int j = 0; j < n; j++)
                                A[i, j] = A[i, j] + gg[i, j] - nASSnA[i, j];
Mumrik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
синусы и ко. циклы, вроде циклы Scorch92 Паскаль, Turbo Pascal, PascalABC.NET 2 22.12.2010 19:26
Циклы boxxxer Помощь студентам 1 16.12.2010 23:20
Циклы hewlett Помощь студентам 3 29.04.2010 21:00
Циклы A_Orlov Паскаль, Turbo Pascal, PascalABC.NET 1 27.04.2010 16:42
Циклы - вложенны циклы? tigga Microsoft Office Excel 5 19.02.2010 23:36