Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Динамическое выделение памяти, Параллельное программирование 
V
    Опции темы
kostyaizznu
Дата 11.12.2009, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 30.10.2008
Где: Запорожье

Репутация: нет
Всего: нет



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

прогу написал, как динамически выделить память под code[n]
 и data[n] dj фрагменте ?
Код

n=0; 

  while (!feof(fp)){
     fscanf(fp,"%d" "%s" ,&code[n], data[n]);
     printf("[%d]%d" "%s" ,mype, code[n], data[n]);
   n++; 

 }



вот весь код. 

Код

#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
#include <string.h>
#include "mpi.h"


int main(int argc, char *argv[])
{ 
  MPI_Comm comm = MPI_COMM_WORLD;
  MPI_Status status;
  char *rcharbuf,*sbuf,st[128], s[30][20],data[100][20];
  int bufsize,*displs, *rbuf,i, j, mype,npes,cnt, n, buf[1],code[100], k[1] ;
  double a,b;
  FILE *fp;
  MPI_Init(&argc, &argv);
  MPI_Comm_size(comm, &npes);
  MPI_Comm_rank(comm, &mype);

  sprintf(st,"data_%d.txt",mype);
  fp = fopen(st, "rt");
  if (fp == NULL) {
    printf("[%d] Cant open file\n", mype);
    MPI_Abort(comm, 0);
  }

n=0; 

  while (!feof(fp)){
     fscanf(fp,"%d" "%s" ,&code[n], data[n]);
//      printf("[%d]%d" "%s" ,mype, code[n], data[n]);
   n++; 

 }
 fclose(fp);
  if (mype==0) {

  printf("В коллективе %d PC\n",npes);
  printf("\nВведите ключ для поиска даннbIх\n");
  scanf("%d", &buf[0]);
 
}   

  printf("я [%d]й, в базе n=%d  записей\n", mype, n);



MPI_Bcast(&buf[0],1,MPI_INT,0,comm);

sbuf=malloc(n);
cnt=0;
for (i=0; i<n; i++ ){                              
    if (code[i]==buf[0]){
          strcpy(sbuf+cnt, data[i]);
          cnt+=strlen(data[i])+1;
        printf("\n%d нашёл соответствие: %s ",mype,data[i]);
    }
}

//   printf("cnt=%d\n", cnt);

rbuf=malloc(n);

MPI_Gather(&cnt,1,MPI_INT,rbuf,1,MPI_INT,0,comm);

displs=malloc(npes);

if (mype == 0) {
  displs[0]=0;

  for (i=1; i<npes; i++){
//    printf("%d\n", rbuf[i]);
    displs[i]=displs[i-1]+rbuf[i-1];
  }

   bufsize=displs[npes-1] + rbuf[npes-1];
//   printf("bufsize=%d\n", bufsize);
   rcharbuf=malloc(bufsize);
}


MPI_Gatherv(sbuf, cnt, MPI_CHAR, rcharbuf, rbuf, displs,MPI_CHAR, 0,comm);

 
if (mype == 0 ) {
printf("\n%d-й принял данные:\n");
 i = 0;
 while (i < bufsize){
   printf("%s\n",rcharbuf+i);
   i += strlen(rcharbuf+i)+1;
  }
  getch();  
}


MPI_Finalize();

return(0);
}







PM MAIL ICQ Skype   Вверх
Abyx
Дата 11.12.2009, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 601
Регистрация: 3.11.2009

Репутация: 5
Всего: 10



Цитата(kostyaizznu @  11.12.2009,  20:25 Найти цитируемый пост)
printf("я [%d]й, в базе n=%d  записей\n", mype, n);

ну да, ну да, [%d]й
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.