Example #1
0
	void multiply(bignum<KEY_BITS*2> &dest,const bignum &b) const throw()
		{ do_multiply(lenof(m),&dest.m[0],&m[0],&b.m[0]); }
Example #2
0
int main(int argc, char ** argv)
{
	int nprocs,myrank;
	MPI_Init(&argc, &argv);
	MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
	MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
	
	char* matrix_file="";
	char* vector_file="";
	char* out_file="";
	int verb=0,partial=0;
	
	int i=1;
	for(i=1;i<argc;i++){//step through arguments
		if (strcmp(argv[i], "-m") == 0){
			matrix_file=argv[i+1];
		}else if (strcmp(argv[i], "-v") == 0){
			vector_file=argv[i+1];
		}else if (strcmp(argv[i], "-o") == 0){
			out_file=argv[i+1];
		}else if (strcmp(argv[i], "-verbose") == 0){
			verb=1;
		}else if (strcmp(argv[i], "-partial") == 0){
			partial=1;
		}
	}
	
	int size=8;
	int root=0;
	int rows_per_process=size/nprocs;//also vector elements per process
	int elements_per_process=size*size/nprocs;
	double matrix[size*size];
	double vector[size];
	double output[size*size];
	double my_rows[elements_per_process];
	//double my_vec[rows_per_process];
	double my_out[elements_per_process];
	
	//make some sample data before we have code in place to read the file
	if(myrank==root){
		int i,j;
		for (i=0; i<size; i++)
			for (j=0; j<size; j++){matrix[i*size + j] = (i*size + j + 1);}
		
		for(i=0; i<size; ++i){vector[i] = (i+1);}
		//print_matrix(&matrix,size,size);
		//print_row(&vector,size);
	}
	
	//scatter the matrix
	MPI_Scatter(matrix,elements_per_process,MPI_DOUBLE,my_rows,elements_per_process,MPI_DOUBLE,root,MPI_COMM_WORLD);
	//broadcast the vector
	MPI_Bcast(vector,size,MPI_DOUBLE,root,MPI_COMM_WORLD);
	
	/*if(myrank==root){
		printf("Proc %i got matrix data:\n",myrank);
		print_matrix(my_rows,rows_per_process,size);
		
		printf("Proc %i got vector data: ",myrank);
		print_row(vector,size);
	}*/
	
	do_multiply(my_rows,vector,my_out,rows_per_process,elements_per_process);
	
	/*if(myrank==root){
		printf("Proc %i multiplied & got:\n",myrank);
		print_matrix(my_out,rows_per_process,size);
	}*/
	
	//gather
	MPI_Gather(my_out,elements_per_process,MPI_DOUBLE,output,elements_per_process,MPI_DOUBLE,root,MPI_COMM_WORLD);
	
	if(myrank==root){
		printf("Final matrix:\n");
		print_matrix(output,size,size);
	}
	
	MPI_Finalize();
	return 0;
}