С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

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

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

23.10.2009, 20:11. Просмотров 1489. Ответов 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 подскажите пожалуйста что не так?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.10.2009, 20:11
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Распараллеливание процесса путем использования алгоритма четно-нечетных перестановок. (C++):

Распараллеливание алгоритма сортировки - C++ WinAPI
Доброго времени суток. Есть программа, в которой реализуется распараллеливание алгоритма сортировки массива. Проблема заключается в...

Распараллеливание алгоритма сортировки - метод вставки - C++
Здравствуйте нужно осуществить распараллеливание алгоритма сортировки - метод вставки на N отдельных потоков. Есть идеи как это...

По заданному числу N найти число Х путем перестановок цифр - C++
В трехзначном числе Х зачеркнули его вторую цифру. Когда к образованному при этом двузначному числу слева приписали вторую цифру числа Х,...

Вывод всех перестановок без использования массивов - C++
Вот есть такая проблема: нужно вывести все возможные перестановки чисел от 1 до n тема жутко заезженная, есть рекурсивные подходы, есть...

Путем перестановок строк и столбцов элемент переместить в правый верхний угол подмассива (С Turbo Pascal на C++) - C++
Можете программу преобразовать в C++?? Задан двумерный массив N x N. Последовательно рассматриваются квадратные подмассивы, правый...

Путем перестановок строк и столбцов (целиком) элемент надо переместить в правый верхний угол подмассива (Перевести программу в c++) - C++
program zadanie_5; uses crt; const nn=5; var i, j, imax, jmax, n, k, m: integer; a: array of real; r: real;...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.10.2009, 20:11
Привет! Вот еще темы с ответами:

Путем использования класса вычислить определенный интеграл(с++) - C++
https://content.foto.my.mail.ru/bk/abishev.ernar/_mypagephoto/h-1.jpg Путем использования класса вычислить определенный интеграл(с++)...

Выведение числа, путем использования минимального количества операций - C++
Суть задачи следующая: в командную строку вводим количество чисел, которое хотим получить, и сами числа. И в результате программа путем...

распараллеливание алгоритма - Delphi WinAPI
Здравствуйте! Я написал последовательную программу скалярного умножение векторов. Мну нужно сделать еще и параллельную. Вот...

Распараллеливание процесса чтения файла - C#
В цикле for у меня читаются фрагменты файла и с ними кое-чего делается без записи в этот или другой файл. Порядок чтения этих фрагментов...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Опции темы

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