Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
KToRRy
Сообщений: n/a
#1

рапараллелить процесс - C++

28.05.2013, 17:03. Просмотров 179. Ответов 0
Метки нет (Все метки)

добрый день.

Помогите пожалуйста...

мне надо на определенном промежутке найти наиболее подходящее значение параметра. для оценивания параметра используется сравнение посчитанного значения со взятым из статистики. перебрать значения надо для 7 параметров одновременно... для этого еще есть рабочие процессы, который осуществляют перебор и диспетчер, который потом обрабатывает значения и считает конечное значение показателя




C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
    int main(int argc, char **argv)
    {
    int rank, size, type=99;
 
    MPI_Status status;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 
    if(rank>0)
    {
        double e[11];
        double ee[11]={0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01, 0.01};
        double k1, k2, k3, k4, k5, k6, n0;
 
        for(int i=1; i<size; i++)
        {
            for(k[0]=0.6+(i-1)*(0.4/(size-1)); k[0]<=0.6+i*(0.4/(size-1)); k[0]+=0.02) // для коэф-та к0 интервал        от 0.6 до 1. он делится на количество процессоров, чтобы считать меньшие интервалы.
                for(k[1]=1+(i-1)*(0.3/(size-1)); k[1]<=1+i*(0.3/(size-1)); k[1]+=0.02)
                    for(k[2]=1+(i-1)*(0.3/(size-1)); k[2]<=1+i*(0.3/(size-1)); k[2]+=0.02)
                        for(k[3]=0.6+(i-1)*(0.4/(size-1)); k[3]<=0.6+i*(0.4/(size-1)); k[3]+=0.02)
                            for(k[4]=0.8+(i-1)*(0.4/(size-1)); k[4]<=0.8+i*(0.4/(size-1)); k[4]+=0.02)
                                for(k[5]=0.6+(i-1)*(0.4/(size-1)); k[5]<=0.6+i*(0.4/(size-1)); k[5]+=0.02)
                                    for(n=0.1+(i-1)*(0.2/(size-1)); n<=0.1+i*(0.2/(size-1)); n+=0.01)
                                    {
                                        while(e[11]>ee[11])
                                        {
                                            for(int t=0; t<11; t++) // пересчет параметров с вызовом из последовательного кода
                                            { for(int i=0; i<6; i++)
                                                  S(i,t);
                                              for (int i=0; i<6; i++)
                                                  LL(i,t);
                                              for (int i=0; i<6; i++)
                                                  Y(i,t);
                                              for (int i=0; i<6; i++)
                                                  VRP1(i,t);
                                            }
                                            for (int t=0; t<11;t++)
                                                e[t]=abs(vrp1[t]-VRP[t]);
                                        }
                                    }
        }
 
         k1=k[0];
         k2=k[1];
         k3=k[2];
         k4=k[3];
         k5=k[4];
         k6=k[5];
         n0=n;
 
         printf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f",k1,k2,k3,k4,k5,k6,n);
 
         for(int i=1;i<size; i++) //передача диспетчеру
         {
             MPI_Send(&k1,1,MPI_DOUBLE, 0, type, MPI_COMM_WORLD);
             MPI_Send(&k2,1,MPI_DOUBLE, 0, type, MPI_COMM_WORLD);
             MPI_Send(&k3,1,MPI_DOUBLE, 0, type, MPI_COMM_WORLD);
             MPI_Send(&k4,1,MPI_DOUBLE, 0, type, MPI_COMM_WORLD);
             MPI_Send(&k5,1,MPI_DOUBLE, 0, type, MPI_COMM_WORLD);
             MPI_Send(&k6,1,MPI_DOUBLE, 0, type, MPI_COMM_WORLD);
         }
    }
    
    if(rank==0)
    {
        double k1, k2, k3, k4, k5, k6, n0;
 
        for (int i=1; i<size;i++) // получение от рабочих процессоров
        {
            MPI_Recv(&k1,1,MPI_DOUBLE, i, type, MPI_COMM_WORLD, &status);
            MPI_Recv(&k2,1,MPI_DOUBLE, i, type, MPI_COMM_WORLD, &status);
            MPI_Recv(&k3,1,MPI_DOUBLE, i, type, MPI_COMM_WORLD, &status);
            MPI_Recv(&k4,1,MPI_DOUBLE, i, type, MPI_COMM_WORLD, &status);
            MPI_Recv(&k5,1,MPI_DOUBLE, i, type, MPI_COMM_WORLD, &status);
            MPI_Recv(&k6,1,MPI_DOUBLE, i, type, MPI_COMM_WORLD, &status);
            MPI_Recv(&n0,1,MPI_DOUBLE, i, type, MPI_COMM_WORLD, &status);
        }
        for(int t=0;t<11;t++) //пересчет
        {
            for(int i=0; i<6; i++)
                S(i,t);
            for (int i=0; i<6; i++)
                LL(i,t);
            for (int i=0; i<6; i++)
                Y(i,t);
            for (int i=0; i<6; i++)
                VRP1(i,t);
        }
 
         printf("%.2f %.2f %.2f %.2f %.2f %.2f %.2f",k1,k2,k3,k4,k5,k6,n);
         printf(" VRP = %.3f", vrp1);
 
         for(int t=0;t<11;t++)
         {
             double e[11];
             e[t]=abs(VRP[t]-vrp1[t]);
             printf("e[t]=%f", e[t]);
         }
    }
 
    MPI_Finalize();
 
    return 0;
 
    }
К сожалению, в настоящее время нет возможности проверить этот код на работоспособность. Подскажите плиз вообще правильный ли ход мысли?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.05.2013, 17:03     рапараллелить процесс
Посмотрите здесь:

Процесс А инициализирует массив случайными значениями и записывает их в файл, а затем запускает процесс Б - C++
В универ нужно сделать лабу по выше указанной теме. Мне не нужно чтобы за меня делали - нужен просто совет. Для начала: Задание:...

Циклический процесс - C++
Помогите пожалуйста. Вывести на экран следующую последовательность символов ******** ******* ****** ***** ****** ******* ...

Процесс в структуре - C++
Положил Popen в структуру. Как если процесс уничтожен, создать новый и положить в структуру. И еще, как сделать чтобы при инициализации...

Внедрение в процесс - C++
я знаю всего 2 способа как перехватить api dll. 1. это поменять код исполняемой dll. 2. или поменять таблицу импорта в исполняемом...

Не создается процесс - C++
Вот часть задания: 1. Создать дочерний процесс Child (добавить к рабочей области еще один консольный вид проекта, при создании дочернего...

Почему процесс прерывается? - C++
char a; while ((a = getch()) != 'exit') { if (a == '1') { char path1, path2; cout &lt;&lt; &quot;Type First Adress&quot; &lt;&lt;...

Неполучается создать процесс - C++
Привет! Такая проблема возникла. В Visual C++ 2010 неполучается создать процесс. CreateProcess(argv,0,0,0,0,0,0,0,&amp;sui,&amp;pi); Пишет,...

Циклический вычислительный процесс - C++
Помогите пожалуйста написать программу которая переписывает элементы главной диагонали двумерного массива 4х4 в одномерный массив.

Заблокировать процесс на WinXp/7/8 - C++
Привет всем. Кто может накидать инфы по тому как можно заблокировать процесс на винде, к примеру Firefox ili Ie. Тоесть чтобы ехе не...

Как убить процесс? - C++
Как убить процесс с помощью программы(консольного приложения)?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru