Tính tổng từ 1 tới n, tính toán song song

Tính tổng từ 1 tới n. Với n = 10^9, thời gian chạy chương trình là 0.38 giây.

Máy tính được sử dụng: Hệ thống máy tính của Trung tâm Khoa học tính toán.

Dùng file này để tạo lệnh:

File: tinh.sh

mpic++ tinhsum_full.cpp -o tinhsum_full
mpiexec -np "$1" tinhsum_full "$2"

chmod u+x tinh.sh

Ví dụ: ./tinh.sh 10 1E9
Nghĩa là: Sử dụng 10 processors để tính tổng từ 1 tới 10^9.

Hoặc: ./tinh.sh 9 44
Nghĩa là: Sử dụng 9 processors để tính tổng từ 1 tới 44.

File: tinhsum_full.cpp

#include <iostream>
#include <time.h> // Thu vien chua ham tinh thoi gian chay cua mot chuong trinh
#include <stdio.h> // Thu vien chua ham in dinh dang printf
#include <mpi.h> // Thu vien dung cho TINH TOAN SONG SONG

using namespace std;

/*
! This program shows how to caculate all the integer numbers from 1 to n by using numnodes processors
*/

/* globals */
int numnodes,myid,mpi_err;

clock_t startwtime, endwtime; // Bien dung de tinh toan thoi gian chay cua chuong trinh

#define mpi_root 0
#define ull unsigned long long
/* end globals  */

void init_it(int  *argc, char ***argv) {
	mpi_err = MPI_Init(argc,argv);
    mpi_err = MPI_Comm_size( MPI_COMM_WORLD, &numnodes );
    mpi_err = MPI_Comm_rank(MPI_COMM_WORLD, &myid);
}

int main(int argc,char *argv[]){
	ull *back_ray;
	ull i,start,finish,total;

    float value;
    ull n;
    sscanf(argv[1], "%f", &value);
    n = value;

	init_it(&argc,&argv);

	int x = numnodes - n%numnodes;

/* create the data on the root */
	if(myid == mpi_root){
            startwtime = clock();
            back_ray= new ull[numnodes];
		}

/* each processor does a local sum */
total = 0;
if (myid < x) {
	start = myid*(n/numnodes)+1;
	finish = start + n/numnodes - 1;
}
else {
    start = myid*(n/numnodes) + myid-x+1;
    finish = start + n/numnodes;
}

	for(i=start;i<=finish;i++) total=total+i;
	printf("...the Processor %d caculates the numbers from %llu to %llu: total = %llu\n", myid, start, finish, total);

/* send the local sums back to the root */
    mpi_err = MPI_Gather(&total,    1,  MPI_UNSIGNED_LONG_LONG, // Gui lai processor chinh gia tri kieu : unsigned long long
						back_ray,   1,  MPI_UNSIGNED_LONG_LONG, // Processor chinh nhan lai gia tri kieu: unsigned long long
	                 	mpi_root, // Day la processor chinh
	                 	MPI_COMM_WORLD);

/* the root prints the global sum */
	if(myid == mpi_root){
            //MPI_Waitall();
	  total=0;
	  for(i=0;i<numnodes;i++) total=total+back_ray[i];

	  cout << "RESULT FROM ALL PROCESSORS = " << total << endl;

	  endwtime = clock();
	  cout << "TIME FOR RUNNING THE PROGRAM: " << (double) (endwtime-startwtime)/CLOCKS_PER_SEC << " s" << endl;
	}

    mpi_err = MPI_Finalize();

}

One Response to “Tính tổng từ 1 tới n, tính toán song song”

  1. tosonnguyen Says:

    Bài viết liên quan: Thời điểm trước khi Gauss ra đời: https://tosonnguyen.wordpress.com/2013/10/03/co-the-ban-chua-biet/


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: