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

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

Войти
Регистрация
Восстановить пароль
 
slavikk07
3 / 3 / 0
Регистрация: 27.02.2013
Сообщений: 64
#1

MPI - C++

24.11.2013, 22:02. Просмотров 393. Ответов 0
Метки нет (Все метки)

У меня есть рабочая программа "Коллективные операции. Работа имитирует реальный поиск в параллельной базе данных. Некоторое множество записей (ключ, данные) распределено по машинам коллектива. Пользователь за головной машиной (№0) вводит некоторый ключ. Головная машина распространяет этот ключ в коллективе, после чего все машины ищут у себя записи с таким ключом. Все машины уведомляют головную о количестве найденных ими записей. Головная машина выделяет буфер нужной длины, собирает ото всех машин результаты поиска и выводит на печать. Используемые функции: MPI_Gather, MPI_Gatherv."

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
107
108
109
#include <stdio.h>
#include <stdlib.h>
#include "mpi.h"
#include <string.h>
 
int main (int argc, char **argv)
{
    int rank, np,
        allsum, count, sumcount, i, ch, n;
int *rcounts, *rsumcounts, *rsumdispls;
    char *sbuf, *rsumdata, buf[101],
         str[101];
MPI_Comm comm = MPI_COMM_WORLD;
 
        
    FILE* fp;
 
    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &np);
 
    sprintf(str, "D:\\parallel programming\\lab4\\data_%d.txt", rank);
 
    fp=fopen(str, "r");
 
    if(NULL == fp)
    {
        printf("\n fopen() Error!!!\n");
        return 1;
    }
 
    for(i=0; i<np; i++) {
      if (i == rank) {
          printf("[%d] The contents of  file:\n", rank);
          while( ( ch = fgetc(fp) ) != EOF )
               printf("%c", (char)ch);
          printf("\n");
      }
      MPI_Barrier(comm);
    }
 
    if(rank == 0)
    {
        printf("input key:");
        scanf("%s", str);
        rcounts = (int *) malloc (np * sizeof(int));
        rsumcounts = (int *) malloc (np * sizeof(int));
        rsumdispls = (int *) malloc (np * sizeof(int));
    }
 
    MPI_Bcast(str, strlen(str)+1, MPI_CHAR, 0, MPI_COMM_WORLD);
 
    count = 0;
    sumcount = 0;
    rewind(fp); 
    while(fgets(buf,100,fp) != NULL )
    {
       if (strstr(buf,str)) {
          count++;
          sumcount += strlen(buf) + 1;
       }
    }
    printf("[%d] count :%d %d\n", rank, count, sumcount);
     
    MPI_Gather(&count, 1, MPI_INT,
              rcounts, 1, MPI_INT, 0, comm); 
    MPI_Gather(&sumcount, 1, MPI_INT,
              rsumcounts, 1, MPI_INT, 0, comm); 
 
if (rank == 0) {
   rsumdispls[0] = 0;
   for(i=1; i<np; i++) {
      rsumdispls[i] =  rsumdispls[i-1] + rsumcounts[i-1];
   }
   allsum = rsumdispls[np-1] + rsumcounts[np-1];
   rsumdata = (char *) malloc( allsum);
}
 
    printf("AFTER GATHER\n");
    sbuf = (char *) malloc (sumcount);
    count = 0;
    sumcount = 0;
    rewind(fp);
    while(fgets(buf,100,fp) != NULL )
    {
       if (strstr(buf,str)) {
          strcpy(sbuf+sumcount, buf);
          count++;
          sumcount += strlen(buf) + 1;
       }
    }
    printf("[%d] count=%d sumcount=%d\n", rank, count, sumcount);
 
    MPI_Gatherv(sbuf, sumcount, MPI_CHAR,
              rsumdata, rsumcounts, rsumdispls, MPI_CHAR, 0, comm); 
 
if (rank == 0) {
  printf("RESULTS:\n");
  count = 0;
  while (count < allsum) {
     count += 1 + printf("%s", rsumdata + count);
     printf("\n");
  }
}
 
    MPI_Finalize();
    fclose(fp);
    return 0;
}
Добавлено через 1 минуту
Подскажите, какая логическая ошибка в 51 строке?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2013, 22:02
Здравствуйте! Я подобрал для вас темы с ответами на вопрос MPI (C++):

MPI - C++
Подскажите пожалуйста что не так то, программа не работает, только при исполнении выдаёт ошибки. #include &lt;iostream&gt; #include &lt;ctime&gt; ...

MPI - C++
Всем добрый день! Извиняюсь за нахальство - у меня аж три вопроса и практически полное...(незнание?):-[ 1)Метод Гаусса для решения СЛАУ...

Установка MPI - C++
Ребята помогите с установкой MPI на VS 2012, уже куча всего по устанавливал, прописал все пути в проекте, всё равно не видит....

MPI и scanf в С++ - C++
Вобщем я делаю параллельную программу. Все процессы в этой программе должны узнать некоторое целое число X, которое пользователь вводит с...

MPI в проекте VS - C++
Поставил все для MPI, использовал MPINCH2, установил все вроде правильно, в свойствах проэекта VS все прописано, но при запуске тестовой...

MPI процессы - C++
пусть n-количество процессов. процесс с номером 0 запрашивает у пользователя элементы квадратной матрицы размерности n и рассылает их всем...

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

MPI в VS 2012 - C++
Здраствуйте, у меня возникла проблема с настройкой библиотеки &quot;mpi.h&quot; студия 2012 стоит. Гуглил, настроики облазил, только хуже сделал(( ...

mpi суммирование - C++
Привет! Такой вопрос. Никак не могу додуматься до реализации такого фрагмента кода. Есть несколько потоков, для каждого из них есть...

С++ с распараллеливанием MPI - C++
Добрый день! Мне очень нужна ваша помощь. Задали написать программу &quot;Метод трапеций для вычисления определенного интеграла&quot;. Сложность в...

MPI программа - C++
Подскажите пожалуйста как исправить ошибку.


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

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

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