Новости
О Центре
Кластер
Обучение
Основной курс по параллельному программированию
Учебные курсы
Магистратура
Дополнительное образование
Работы студентов
Библиотека
Исследования
Конференции
Полезные ссылки
NVIDIA
Контакты
О сайте
Имя:
Пароль:
запомнить:
Забыли пароль? Регистрация

Реализация

Функция MergeSortUp - осуществляет сортировку массива по возрастанию

void MergeSortUp(int* ar, int n) //ar - указатель на начало массива, n - число элементов в массиве

{

  if (n>1)

  {

    int split=n/2;

    MergeSortUp(ar,split);

    MergeSortUp(&ar[split],split+n%2);

    MergeUp(ar,split,&ar[split],split+n%2);

  }

};



Функция MergeUP сливает два отсортированных по возрастанию массива

void MergeUp(int* ar1, int n1, int* ar2, int n2)

{

  int* buf=new int[n1+n2];

  int i=0,j=0,pos=0;

  while ((i
  {

    if (ar1[i]>ar2[j])

    {

      buf[pos]=ar2[j];

      j++;

    }

    else

    {

      buf[pos]=ar1[i];

      i++;

    }

    pos++;

  }

  if (i==n1) //Разобрались с остатком

    for (i=j; i
    {

      buf[pos]=ar2[i];

      pos++;

    }

  else

    for (j=i; j
    {

      buf[pos]=ar1[j];

      pos++;

    }

  for (i=0; i
    ar1[i]=buf[i];

  delete[] buf;

};





Основное тело программы

if (numberofprocess==1) //Если у нас только один поток - просто взяли и отсортировали

    MergeSortUp(ar,n);

  else //Иначе - распределяем данные

  {

    MPI_Bcast(&n,1,MPI_UNSIGNED,0,MPI_COMM_WORLD);

    Counts=new int[numberofprocess];

    displs=new int[numberofprocess];

    displs[0]=0;

    int count=n/numberofprocess, ost=n%numberofprocess;

    for (int i=0; i
    {

      Counts[i]=count;

      if (ost>0)

      {

        Counts[i]++;

        ost--;

      }

      if (i>0)

        displs[i]=displs[i-1]+Counts[i-1];

    }

    myn=Counts[myrank];

    WorkingArray=new int[myn];

    if (myrank!=0)

      ar=new int[n];

    MPI_Scatterv(ar,Counts,displs,MPI_UNSIGNED,WorkingArray,n,MPI_UNSIGNED,0,MPI_COMM_WORLD); //Рассылаем

    MergeSortUp(WorkingArray,myn); //Сортируем

    MPI_Gatherv(WorkingArray,Counts[myrank],MPI_UNSIGNED,ar,Counts,displs,MPI_UNSIGNED,0,MPI_COMM_WORLD); //Собираем

  }

  if (myrank==0)

  {

    //cout << numberofprocess << endl;

    for (int i=0; i
    {

      MergeUp(ar,Counts[i],&ar[displs[i+1]],Counts[i+1]);

      Counts[i+1]+=Counts[i];

    }

  }



Новости

22.10.2012
04.09.2012
05.04.2012
06.03.2012
02.03.2012