int main()
{
	int *a;			// matrix A
	int *b;			// matrix B
	int *c;			// matrix C
	FILE* output = fopen("output.txt","w");
	
	a = new int[n*n];
	b = new int[n*n];
	c = new int[n*n];

	/*for (int i = 0; i < n*n; i++)
	{
		a[i] = i + 1;
		b[i] = n*n - i;
	}
*/
	for (int i = 0; i < n*n; i++)
	{
		a[i] = rand() % 50;
		b[i] = rand() % 50;
	}

	memset(c, 0, n*n*sizeof(int));
	
	double time = PortableGetTime();
	for (int i = 0; i < n; i++)
		for(int j = 0; j < n; j++)
			for (int k = 0; k < n; k++)
			{
				c[i*n+j] += a[i*n+k] * b[k*n + j];
			}
	
	time = PortableGetTime() - time; 
	fprintf(output,"\n");
	for (int i = 0; i < n; i++)
	{
		
		for (int j = 0; j < n; j++)
			fprintf(output,"%d ", c[i*n+j]);
		fprintf(output,"\n");
	}
	fprintf(output,"\ntime = %lf", time);
}
int sumMPI(int *a, int n, double &time, int argc, char *argv[])
{
	int s = 0;					// êîíå÷íàÿ ñóììà âñåõ êîìïîíåíòîâ âåêòîðà 
	int processSum  = 0;		// ñóììà ÷àñòè ýëåìåíòîâ äàííûõ ïðîöåññó
	int processRank = 0;		// íîìåð ïðîöåññà
	int processNumb = 0;		// êîë-âî ïðîöåññîâ
	int processRecv = 0;		// áóôåð äëÿ ïîëó÷åíèÿ äàííûõ îò äðóãèõ ïðîöåññîâ
	
	time = PortableGetTime();	
	MPI_Status status;

	MPI_Comm_rank(MPI_COMM_WORLD, &processRank);	
	MPI_Comm_size(MPI_COMM_WORLD, &processNumb);

	int k = n/processNumb;
	int start  = k * processRank;
	int finish = k * (processRank + 1);
	if (processRank == (processNumb-1)) finish = n;
	
	for (int i = start; i < finish; i++)
		processSum += a[i];

	if (processRank == 0) 
	{
		s = processSum;
		for (int i = 1; i < processNumb; i++)
		{
			MPI_Recv(&processRecv, 1, MPI_INT, i, MPI_ANY_TAG, MPI_COMM_WORLD, &status);
			s +=processRecv;
		}
		printf("s = %d\n", s);
	}
	else MPI_Send(&processSum, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
	if (processRank == 0) 
		printf("%d\n",s);
	
	//fflush(stdout);
	MPI_Finalize();

	time = PortableGetTime() - time;

	return s;
}
int main(int argc, char* argv[])
{
	double AllTime=0;
    double x0=0.0, y0=0.0, z0=0.0;
    double xn=10.0, yn=10.0, zn=10.0;
    int Sx=100, Sy=100, Sz=100, St=100;
	if (argc>1) Sx=Sy=Sz=atoi(argv[1]);
    double * masprev;
    double * masnext;
    masprev=new double[Sx*Sy*Sz];
    masnext=new double[Sx*Sy*Sz];
    double dx=(xn-x0)/Sx, dy=(yn-y0)/Sy, dz=(zn-z0)/Sz;
   
    FILE* filex=fopen("filex.txt","w");
    FILE* filey=fopen("filey.txt","w");
    FILE* filez=fopen("filez.txt","w");	

	fprintf(filex,"%d %f %f\n",Sx,x0,xn);
	fprintf(filey,"%d %f %f\n",Sy,y0,xn);
	fprintf(filez,"%d %f %f\n",Sz,z0,xn);
	
	fprintf(filex,"%f %f\n",4.0,0);
	fprintf(filey,"%f %f\n",4.0,0);
	fprintf(filez,"%f %f\n",4.0,0);
	
    double dt=0.000001;			//выбираем dt
    memset(masprev, 0, Sx*Sy*Sz*sizeof(double));
	memset(masnext, 0, Sx*Sy*Sz*sizeof(double));
    for (int x=1; x<Sx-1; x++)
        for(int y=1; y<Sy-1; y++)
            for(int z=1; z<Sz-1; z++)
                masprev[x+y*Sx+z*Sx*Sy]=u(x0+dx*x, y0+dy*y, z0+dz*z);
	int maxi; double max = 0.0;
	for( int i = 0; i < Sx*Sy*Sz; i ++ ){
		if( masprev[i] > max ){
			max = masprev[i];
			maxi = i;
		}
	}
	printf("i=%d, max=%f\n", maxi, max);
	for(int x=1; x<Sx-1; x++)										//
		fprintf(filex,"%f ", masprev[x+25*(Sx)+25*(Sx)*(Sy)]);	//
	for(int y=1; y<Sy-1; y++)										//
		fprintf(filey,"%f ", masprev[25+y*(Sx)+25*(Sx)*(Sy)]);	// вывод в файл
	for(int z=1; z<Sz-1; z++)										//
		fprintf(filez,"%f ", masprev[25+25*(Sx)+z*(Sx)*(Sy)]);	//

	fprintf(filex,"\n");											// 
	fprintf(filey,"\n");											// переводим указатель на новую строчку
	fprintf(filez,"\n");											// 
	
	double Time;
	double _Time;
    double *dev_a,*dev_b;
	cudaMalloc( (void**)&dev_a, Sx*Sy*Sz*sizeof(double));
	cudaMalloc( (void**)&dev_b, Sx*Sy*Sz*sizeof(double));
	cudaMemset(dev_a,0, Sx*Sy*Sz*sizeof(double));
	cudaMemset(dev_b,0,Sx*Sy*Sz*sizeof(double));
	cudaMemcpy(dev_a,masprev,Sx*Sy*Sz*sizeof(double),cudaMemcpyHostToDevice);
	
	double ddx=1.0;//(dx*dx);
	double ddy=1.0;//(dy*dy);
	double ddz=1.0;//(dz*dz);

	Time=PortableGetTime();
	for (int t=1; t<St; t++)
    {
		StartCuda(dev_a,dev_b,Sx, Sy, Sz,dx,dy,dz,x0,y0,z0,dt,ddx,ddy,ddz);
		cudaMemcpy(masprev,dev_b,Sx*Sy*Sz*sizeof(double),cudaMemcpyDeviceToHost);
		double* tmp=dev_b;
		dev_b=dev_a;
		dev_a=tmp;
		for(int x=1; x<Sx-1; x++)										//
			fprintf(filex,"%f ", masprev[x+25*(Sx)+25*(Sx)*(Sy)]);	//
		for(int y=1; y<Sy-1; y++)										//
			fprintf(filey,"%f ", masprev[25+y*(Sx)+25*(Sx)*(Sy)]);	// вывод в файл
		for(int z=1; z<Sz-1; z++)										//
			fprintf(filez,"%f ", masprev[25+25*(Sx)+z*(Sx)*(Sy)]);	//

		fprintf(filex,"\n");											// 
		fprintf(filey,"\n");											// переводим указатель на новую строчку
		fprintf(filez,"\n");											// 

    }
	for(int x=1; x<Sx-1; x++)										//
		fprintf(filex,"%f ", masprev[x+25*(Sx)+25*(Sx)*(Sy)]);	//
	for(int y=1; y<Sy-1; y++)										//
		fprintf(filey,"%f ", masprev[25+y*(Sx)+25*(Sx)*(Sy)]);	// вывод в файл
	for(int z=1; z<Sz-1; z++)										//
		fprintf(filez,"%f ", masprev[25+25*(Sx)+z*(Sx)*(Sy)]);	//

	fprintf(filex,"\n");											// 
	fprintf(filey,"\n");											// переводим указатель на новую строчку
	fprintf(filez,"\n");											// 
	
	_Time=PortableGetTime();
	AllTime=_Time-Time;
	
	printf(" %lf \n",AllTime);

	system("PAUSE");
	fclose(filex);
    fclose(filey);
    fclose(filez);
	delete[] masprev;
	delete[] masnext;
	cudaFree(dev_a);
	cudaFree(dev_b);
    return 0;
}
int main()
{

	//ввод данных 
		int n; // размер матрицы A и B
		int *A;
		int *B;
		int *C;
		FILE* output=fopen("output.txt","w+");  
		scanf("%d",&n);
		srand(time(0));
		A=new int[n*n];
		B=new int[n*n];
		for (int i=0;i<n;i++)
		{
			for (int j=0;j<n;j++)
			{
				A[i*n+j]=rand()% n;
				B[i*n+j]=rand()% n;
			}
		}
		C=new int[n*n];
		memset(C, 0, n*n*sizeof(int));
	//	рассчет влоб!
		double time=PortableGetTime();
		for(int i=0; i<n;i++)
			for(int j=0;j<n;j++)
			{
				for(int k=0; k<n; k++)
				{
					C[i*n+j]+=A[i*n+k]*B[k*n+j];
				}
					
			}
		double time1=PortableGetTime();
	// вывод в консоль
		for (int i=0;i<n;i++)
		{
			for (int j=0;j<n;j++)
			{
				fprintf(output,"%d ",C[i*n+j]);
			}
			fprintf(output,"\n");
		}
		fprintf(output,"%lf\n",time1-time);
		
	// Параллелим на cuda 
		int *dev_a,*dev_b,*dev_c;
		// выделяем память на gpu
		cudaMalloc( (void**)&dev_a, n*n*sizeof(int));
		cudaMalloc( (void**)&dev_b, n*n*sizeof(int));
		cudaMalloc( (void**)&dev_c, n*n*sizeof(int));
		//копируем массивы А и B на gpu
		cudaMemcpy(dev_a, A, n*n*sizeof(int),cudaMemcpyHostToDevice);
		cudaMemcpy(dev_b, B, n*n*sizeof(int),cudaMemcpyHostToDevice);
		cudaMemset(dev_c,0,n*n*sizeof(int));
		//запуск cuda
		time=PortableGetTime();

		StartCuda(dev_a,dev_b,dev_c,n);

		time1=PortableGetTime();
		//копируем обратно
		cudaMemcpy(C,dev_c,n*n*sizeof(int),cudaMemcpyDeviceToHost);

		for (int i=0;i<n;i++)
		{
			for (int j=0;j<n;j++)
			{
				fprintf(output,"%d ",C[i*n+j]);
			}
			fprintf(output,"\n");
		}
		fprintf(output,"%lf\n",time1-time);

		fclose(output);
		cudaFree(dev_a);
		cudaFree(dev_b);
		cudaFree(dev_c);
		delete A;
		delete B;
		delete C;
}
Beispiel #5
0
int main()
{
    double AllTime=PortableGetTime();
    double x0=0.0, y0=0.0, z0=0.0;
    double xn=10.0, yn=10.0, zn=10.0;
    int Sx=300, Sy=300, Sz=300, St=100;
    double * masprev;
    double * masnext;
    masprev=new double[Sx*Sy*Sz];
    masnext=new double[Sx*Sy*Sz];
    double dx=(xn-x0)/Sx, dy=(yn-y0)/Sy, dz=(zn-z0)/Sz;
   
    FILE* filex=fopen("filex.txt","w");
    FILE* filey=fopen("filey.txt","w");
    FILE* filez=fopen("filez.txt","w");

    double dt=0.00001;				//выбираем dt
    omp_set_dynamic(0);      // запретить библиотеке openmp менять число потоков во время исполнения
    omp_set_num_threads(4); // установить число потоков в 10
    memset(masprev, 0, Sx*Sy*Sz*sizeof(double));
	memset(masnext, 0, Sx*Sy*Sz*sizeof(double));
    for (int x=1; x<Sx-1; x++)
        for(int y=1; y<Sy-1; y++)
            for(int z=1; z<Sz-1; z++)
                masprev[x+y*Sx+z*Sx*Sy]=u(x0+dx*x, y0+dy*y, z0+dz*z);
    fprintf(filex,"%e\n", dx);
    fprintf(filey,"%e\n", dy);
    fprintf(filez,"%e\n", dz);
    fprintf(filex,"%i\n", Sx);
    fprintf(filey,"%i\n", Sy);
    fprintf(filez,"%i\n", Sz);
    for(int x=0; x<Sx; x++)
        fprintf(filex,"%lf ", masprev[x+49*Sx+49*Sx*Sy]);
    for(int y=0; y<Sy; y++)
        fprintf(filey,"%lf ", masprev[49+y*Sx+49*Sx*Sy]);
    for(int z=0; z<Sz; z++)
        fprintf(filez,"%lf ", masprev[49+49*Sx+z*Sx*Sy]);
    fprintf(filex,"\n");
    fprintf(filey,"\n");
    fprintf(filez,"\n");

	double Time=PortableGetTime();

    for (int t=1; t<St; t++)
    {        
		#pragma omp parallel for
        for (int z=1; z<Sz-1; z++)
        {
            for(int y=1; y<Sy-1; y++)
            {
                for(int x=1; x<Sx-1; x++)
                {
                    masnext[x+y*Sx+z*Sx*Sy]=
                        dt*((masprev[(x+1)+y*Sx+z*Sx*Sy]-2*masprev[x+y*Sx+z*Sx*Sy]+masprev[(x-1)+y*Sx+z*Sx*Sy])/(dx*dx)
                       +(masprev[x+(y+1)*Sx+z*Sx*Sy]-2*masprev[x+y*Sx+z*Sx*Sy]+masprev[x+(y-1)*Sx+z*Sx*Sy])/(dy*dy)
                       +(masprev[x+y*Sx+(z+1)*Sx*Sy]-2*masprev[x+y*Sx+z*Sx*Sy]+masprev[x+y*Sx+(z-1)*Sx*Sy])/(dz*dz)
                       +f(x0+dx*x, y0+dy*y, z0+dz*z)-masprev[x+y*Sx+z*Sx*Sy])+masprev[x+y*Sx+z*Sx*Sy];
                }
            }
        }

        double* tmp=masprev;
        masprev=masnext;
        masnext=tmp;
    }

    Time=PortableGetTime()-Time;

    fprintf(filex,"%i\n", Sx);
    fprintf(filey,"%i\n", Sy);
    fprintf(filez,"%i\n", Sz);
    for(int x=0; x<Sx; x++)
        fprintf(filex,"%lf ", masprev[x+49*Sx+49*Sx*Sy]);
    for(int y=0; y<Sy; y++)
        fprintf(filey,"%lf ", masprev[49+y*Sx+49*Sx*Sy]);
    for(int z=0; z<Sz; z++)
        fprintf(filez,"%lf ", masprev[49+49*Sx+z*Sx*Sy]);
    fprintf(filex,"\n");
    fprintf(filey,"\n");
    fprintf(filez,"\n");

    AllTime=PortableGetTime()-AllTime;
    printf(" %lf \n %lf \n",Time, AllTime);
    fclose(filex);
    fclose(filey);
    fclose(filez);

	delete[] masprev;
	delete[] masnext;

    return 0;
}