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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Артин
2 / 2 / 1
Регистрация: 27.06.2008
Сообщений: 29
#1

Распараллеливание процесса путем использования алгоритма четно-нечетных перестановок. - C++

23.10.2009, 20:11. Просмотров 1455. Ответов 0
Метки нет (Все метки)

Здравствуйте. Необходимо в среде Turbo C на вычислительном кластере под Linux с использованием MPI распараллелить глупую сортировку массива с использованием алгоритма чётно-нечётных перестановок. Программа должна выводить время, затраченное на выполнение задачи в качестве результата. Так же прога должна корректно выполнятся на 1м, 5 и 10 компьютерах.
Собственно доступ к кластеру имеется раз в неделю и менее чем на час. Я составил программу согласно алгоритму, но она не работает - виснет.

Алгоритм - http://www.software.unn.ru/cluster/c...work=4&topic=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
# include <mpi.h>
# include <time.h>
# include <stdio.h>
# include <stdlib.h>
 
int n = 3000;
 
void cremas(long mas[]) {
    int i;
    for(i = 0; i < n; i++)
       mas[i] = random()/256;
}
 
void outmas(long mas[]) {
    int i;
    for(i = 0; i < n; i++)
       printf("%5.d", mas[i]);
}
 
void sort(long mas[10][3000], int g, int k, int l) {
    int i = k, tmp;
    while (i < l-1) {
      if (mas[g][i+1] < mas[g][i]) {
         tmp = mas[g][i];
         mas[g][i] = mas[g][i+1];
         mas[g][i+1] = tmp;
         i = 0;
      }
      else i++;
       }
}
 
int main(int argc, char **argv) {
    long t0, t1, mat[3000], inmat[3000], inmat2[10][1500];
    int i, j, l, k1, k2, source, tag = 1, rank, num;
    MPI_Status stat;
    MPI_Init(&argc, &argv);
    MPI_Comm_size(MPI_COMM_WORLD, &num);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if (rank == 0) {
       t0 = clock();
       cremas(mat);
       //outmas(mat);
       if (num > 4) {
          for (i = 1; i < num; i++)
              MPI_Send(mat, n, MPI_INT, i, tag, MPI_COMM_WORLD);
          k1 = k2 = 0;
          for (i = 1; i < num; i++) {
              MPI_Recv(inmat, n, MPI_INT, i, tag, MPI_COMM_WORLD, &stat);
              for (j = 0; j < n/(num-1); j++) mat[i*n/(num-1)+j] = inmat[j];
          }
       }
       else sort(mat, 0, 0, n);
       //outmas(mat);
       t1 = clock() - t0;
       printf("\nProc's - %d, Time - %i mcs\n", num, t1);
    }
    for (i = 1; i < num; i++) if (rank == i) {
         source = 0;
         MPI_Recv(inmat, n, MPI_INT, source, tag, MPI_COMM_WORLD, &stat);
         for (j = 0; j < n/num; j++) inmat2[i][j] = inmat[i*n/num+j];
         sort(inmat2, i, 0, n/(num-1)); 
    }
    for (j = 0; j < num-1; j++)
        for (i = 0; i < num-1; i++) if (rank == i+1) {
            if (j % 2 == i % 2) source = i+2;
            else source = i;
            if ((source > 0)&&(source < num)) {
               for (l = 0; l < n/(num-1); l++) inmat[l] = inmat2[i][l];
               MPI_Send(inmat, n, MPI_INT, source, tag, MPI_COMM_WORLD);
               MPI_Recv(mat, n, MPI_INT, source, tag, MPI_COMM_WORLD, &stat);
               for (l = 0; l < n/(num-1); l++) inmat2[i][n/(num-1)+l] = mat[l];
               sort(inmat2, i, 0, 2*n/(num-1));
               if (j % 2 != i % 2)
                  for (l = 0; l < n/(num-1); l++) inmat2[i][l] = inmat2[i][n/(num-1)+l];
               } 
           }
    for (i = 0; i < num; i++) if (rank == (i+1)) {
        for (l = 0; l < n/(num-1); l++) inmat[l] = inmat2[i][l];
        MPI_Send(inmat, n, MPI_INT, 0, tag, MPI_COMM_WORLD); 
    }
    MPI_Finalize();
}
Люди, хорошо знающие MPI подскажите пожалуйста что не так?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2009, 20:11     Распараллеливание процесса путем использования алгоритма четно-нечетных перестановок.
Посмотрите здесь:
Распараллеливание алгоритма сортировки C++ WinAPI
C++ Распараллеливание алгоритма сортировки - метод вставки
По заданному числу N найти число Х путем перестановок цифр C++
C++ Вывод всех перестановок без использования массивов
C++ Путем перестановок строк и столбцов элемент переместить в правый верхний угол подмассива (С Turbo Pascal на C++)
Путем перестановок строк и столбцов (целиком) элемент надо переместить в правый верхний угол подмассива (Перевести программу в c++) C++
Путем использования класса вычислить определенный интеграл(с++) C++
Выведение числа, путем использования минимального количества операций C++
найти все кратные 7 положительные элементы столбца, у которого произведение отрицательных элементов четно C++
Удалить средний (два средних, если количество элементов в списке четно) элемент списка C++
C++ Builder Чтение памяти другого процесса по таймеру: нужно ли закрывать хэндл процесса?
C++ WinAPI при создании процесса создаётся ярлык в трее, по окончании процесса он не убираетс сам, как его убрать оттуда?

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

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

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