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

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

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

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

28.05.2013, 17:03. Просмотров 175. Ответов 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++
Есть процесс A и дочерний процесс B, который находит хэндл родительского процесса A. И этот хэндл в разных случаях РАЗНЫЙ! Почему? C++
Неполучается создать процесс C++
Не создается процесс C++
Почему процесс прерывается? C++
Внедрение в процесс C++
C++ Процесс А инициализирует массив случайными значениями и записывает их в файл, а затем запускает процесс Б
C++ Родительский и дочерний процесс
C++ Не создаётся процесс
Инжект DLL в процесс C++
Циклический процесс C++
C++ Проверка на запущенный процесс

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

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

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