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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите распараллелить 
:(
    Опции темы
vio
  Дата 5.6.2005, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я написала програмку на С++, но как ее распараллелить под UNIX не понимаю, если кто знает помогите пожалуйста!
Код

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <iostream.h>
#include <conio.h>
#include <fstream.h>
#include <math.h>

void RowMultiplyNumber(double a[],int n,int m,int k,double Number)
{
register int i;
for(i=0;i<m;i++,k+=n)
    a[k]*=Number;
}

void RowInterchange(double a[],int n,int m,int k,int l)
{
    register int i;
    double save;
    for(i=0;i<m;i++,k+=n,l+=n)
    {
        save = a[k];
        a[k]=a[l];
        a[l]=save;
    }
}

void ArrayToArray(double x[],double y[],int n)
{
    for(register int i=0;i<n;i++)
    y[i]=x[i];
}

int SimpleIteration(double a[],double b[],double x[],int n,double Esp,int *Max)
{
    register int i,j;
    int Iter=0,Code=0,End,i1,m;
    double *x1,Maximum,Probe,Sign;

for(i=0;i<n-1;i++)
{
    m=i*n+i;
    i1=i;
    Maximum=fabs(a[m]);
    Sign= a[m] >= 0 ? 1 : -1;
    for(j=i+1;j<n;j++)
    {
        Probe = fabs(a[++m]);
        if(Maximum<Probe)
        {
            i1=j;
            Maximum=Probe;
            Sign = a[m] >= 0 ? 1 : -1;
        }
    }
    if(Maximum == 0)
        return -3;
    if(Sign==-1)
    {
        RowMultiplyNumber(a,n,n,i1,Sign);
        b[i1]*=Sign;
    }
    if(i!=i1)
    {
        RowInterchange(a,n,n,i,i1);
        RowInterchange(b,n,n,i,i1);
    }
}
if((x1=new double[n])==0)
    return -1;
do
{
    for(i=0;i<n;i++)
    {
        x1[i]=0;
        for(j=0,m=i;j<n;j++,m+=n)
            x1[i] +=a[m]*x[j];
            if(a[i*n+1]==0)a[i*n+1]=0.01;
        x1[i] = x[i]-(x1[i]-b[i])/a[i*n+i];
    }
if(++Iter>*Max)
{
    Code=-2;
    break;
}
for(i=0,End=0;i<n;i++)
    if(fabs(x1[i]-x[i])>Esp)
    {
        End=1;
        break;
    }

    ArrayToArray (x1,x,n);
}while(End==1);
delete [] x1;
*Max = Iter-1;
return Code;
}

int main()
{
do
{
    double A[5][5];
double B[5][5];
double K[5];
double H[5][5];
double L[9];
        int MaxIter=100;
    int n=4;
    int i=0,j=0,m=0;
    clrscr();
    srand(time(NULL));
    printf("na4al'naia matrix:\n");
    for(i=0;i<=n-1;i++)//zapolnenie i vivod na4al'noi matrix
        {
            for(j=0;j<=n-1;j++)
            {
            H[i][j]=rand()%10;
            A[i][j]=H[i][j];
            printf("%lf\t",H[i][j]);
            }
            printf("\n");
        }
    printf("\n");
L[0]=1;
L[1]=-A[0][0]-A[1][1]-A[2][2]-A[3][3];
L[2]=-A[2][3]*A[3][2]+A[2][2]*A[0][0]+A[3][3]*A[0][0]-A[3][1]*A[1][3]+A[1][1]*A[2][2]+A[1][1]*A[0][0]+A[2][2]*A[3][3]-A[2][1]*A[1][2]+A[1][1]*A[3][3]-A[1][0]*A[0][1]-A[3][0]*A[0][3]-A[2][0]*A[0][2];
L[3]=-A[1][1]*A[3][3]*A[0][0]+A[1][0]*A[0][1]*A[3][3]-A[1][1]*A[2][2]*A[3][3]-A[3][1]*A[1][2]*A[2][3]-A[2][0]*A[0][3]*A[3][2]-A[2][1]*A[1][3]*A[3][2]+A[1][0]*A[0][1]*A[2][2]+A[2][0]*A[0][2]*A[3][3]-A[1][0]*A[3][1]*A[0][3]+A[2][0]*A[1][1]*A[0][2]+A[3][0]*A[1][1]*A[0][3]+A[2][1]*A[1][2]*A[3][3]-A[1][0]*A[2][1]*A[0][2]+A[2][3]*A[3][2]*A[0][0]+A[2][1]*A[1][2]*A[0][0]-A[2][2]*A[3][3]*A[0][0]+A[3][1]*A[1][3]*A[2][2]-A[2][0]*A[0][1]*A[1][2]+A[3][1]*A[1][3]*A[0][0]-A[1][1]*A[2][2]*A[0][0]-A[3][0]*A[0][2]*A[2][3]+A[3][0]*A[0][3]*A[2][2]-A[3][0]*A[0][1]*A[1][3]+A[1][1]*A[2][3]*A[3][2];
L[4]=A[1][0]*A[0][1]*A[2][3]*A[3][2]+A[0][1]*A[2][1]*A[0][2]*A[3][3]-A[1][0]*A[2][1]*A[0][3]*A[3][2]-A[1][0]*A[0][1]*A[2][2]*A[3][3]-A[3][0]*A[2][1]*A[0][2]*A[1][3]+A[3][0]*A[2][1]*A[0][3]*A[1][2]-A[3][0]*A[1][1]*A[0][3]*A[2][2]-A[1][1]*A[2][3]*A[3][2]*A[0][0]-A[2][1]*A[1][2]*A[3][2]*A[0][0]+A[2][1]*A[1][3]*A[3][2]*A[0][0]+A[3][1]*A[1][2]*A[2][3]*A[0][0]-A[3][1]*A[1][3]*A[2][2]*A[0][0]+A[1][1]*A[2][2]*A[3][3]*A[0][0]-A[1][0]*A[3][1]*A[0][2]*A[2][3]+A[1][0]*A[3][1]*A[0][3]*A[2][2]-A[2][0]*A[3][1]*A[0][3]*A[1][2]+A[2][0]*A[1][1]*A[0][3]*A[3][2]+A[2][0]*A[3][1]*A[0][2]*A[1][3]+A[3][0]*A[1][1]*A[0][2]*A[2][3]+A[2][0]*A[0][1]*A[1][2]*A[3][3]-A[2][0]*A[0][1]*A[1][3]*A[3][2]-A[3][1]*A[1][1]*A[0][2]*A[3][3]-A[3][0]*A[0][1]*A[1][2]*A[2][3]+A[3][0]*A[0][1]*A[1][3]*A[2][2];
printf("%lf%lf%lf%lf%lf\n",L[0],L[1],L[2],L[3],L[4]);
j=0;
for(i=-100;i<100;i++)
{
    if((((i-1)*(i-1)*(i-1)*(i-1)*L[0]+L[1]*(i-1)*(i-1)*(i-1)+L[2]*(i-1)*(i-1)+L[3]*(i-1)+L[4]>0) && (i*i*i*i*L[0]+L[1]*i*i*i+L[2]*i*i+L[3]*i+L[4]<0))
        || (((i-1)*(i-1)*(i-1)*(i-1)*L[0]+L[1]*(i-1)*(i-1)*(i-1)+L[2]*(i-1)*(i-1)+L[3]*(i-1)+L[4]<0) && (i*i*i*i*L[0]+L[1]*i*i*i+L[2]*i*i+L[3]*i+L[4]>0)))
    {    K[j]=i;
        j++;
        if(j==5) break;
        printf("i%lf\n",i);
    }

}

for(m=j;m>0;m--)
{
int p=0;
double a[16];
for (j=0;j<4;j++)
    {for (i=0;i<4;i++)
        {a[p]=A[i][j];
        p++;
        }
    }
//reshenie sistemi yravnenii!
MaxIter=100;
double        b[]={    0,0,0,0},
        x[]={    0.1,0.1,0.1,0.1};
    printf("return code= %lf",SimpleIteration(a,b,x,n,0.000001,&MaxIter));
    printf("\n Maximum of iteration = %lf\n",MaxIter);
    for(i=0;i<n;i++)
        printf("%lf\n",x[i]);

}
delete []A;
delete []B;
delete []H;
}while(getch()!=27);
return 0;

}

PM MAIL   Вверх
achmed
Дата 5.6.2005, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



нужно смотреть в всторону библиотек для параллельных вычислений, например MPI

http://parallel.ru


PM MAIL   Вверх
dwr_budr
Дата 12.6.2005, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



vio смотря для какой системы ты эту программу пишешь.

Если к примеру для многопроцессорной системы с общей памятью, то используй pthreads или OpenMP
Если же система где много процессоров и у каждого своя память - как написал achmed, т.е. MPI, к примеру этот LAM-MPI
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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