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; }
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; }