Commit 2799f3eb authored by Björn Fischer's avatar Björn Fischer

parameter for threads

parent f7db8b76
...@@ -3,9 +3,10 @@ ...@@ -3,9 +3,10 @@
#include <stdlib.h> #include <stdlib.h>
#include <math.h> #include <math.h>
void Process_Args(int argc, char **argv, int *m, int *n, double *eps, double *delta_t) { void Process_Args(int argc, char **argv, int *num_threads, int *m, int *n, double *eps, double *delta_t) {
if ((argc < 3) || (argc > 5)) { if ((argc < 4) || (argc > 6)) {
fprintf(stderr, "Usage: heat <m> <n> [<epsilon> [delta_t]]!\n\n"); fprintf(stderr, "Usage: main <num_threads> <m> <n> [<epsilon> [delta_t]]!\n\n");
fprintf(stderr, " <num_threads> -- Number of threads\n");
fprintf(stderr, " <m> -- X-Size of matrix\n"); fprintf(stderr, " <m> -- X-Size of matrix\n");
fprintf(stderr, " <n> -- Y-Size of matrix\n"); fprintf(stderr, " <n> -- Y-Size of matrix\n");
fprintf(stderr, " <epsilon> -- accuracy parameter\n"); fprintf(stderr, " <epsilon> -- accuracy parameter\n");
...@@ -13,15 +14,17 @@ void Process_Args(int argc, char **argv, int *m, int *n, double *eps, double *de ...@@ -13,15 +14,17 @@ void Process_Args(int argc, char **argv, int *m, int *n, double *eps, double *de
exit(1); exit(1);
} }
*num_threads = atoi(argv[1]);
/* /*
** Erstes und zweites Argument: Größe der Matrix ** Erstes und zweites Argument: Größe der Matrix
*/ */
*m = atoi(argv[1]); *m = atoi(argv[2]);
if ((*m < 3) || (*m > 6000)) { if ((*m < 3) || (*m > 6000)) {
fprintf(stderr, "Error: size m out of range [3 .. 6000] !\n"); fprintf(stderr, "Error: size m out of range [3 .. 6000] !\n");
exit(1); exit(1);
} }
*n = atoi(argv[2]); *n = atoi(argv[3]);
if ((*n < 3) || (*n > 6000)) { if ((*n < 3) || (*n > 6000)) {
fprintf(stderr, "Error: size n out of range [3 .. 6000] !\n"); fprintf(stderr, "Error: size n out of range [3 .. 6000] !\n");
exit(1); exit(1);
...@@ -29,8 +32,8 @@ void Process_Args(int argc, char **argv, int *m, int *n, double *eps, double *de ...@@ -29,8 +32,8 @@ void Process_Args(int argc, char **argv, int *m, int *n, double *eps, double *de
/* /*
** Drittes (optionales) Argument: "Genauigkeitsfaktor" eps ** Drittes (optionales) Argument: "Genauigkeitsfaktor" eps
*/ */
if (argc >= 4) { if (argc >= 5) {
*eps = atof(argv[3]); *eps = atof(argv[4]);
} }
if ((*eps <= 0) || (*eps > 0.01)){ if ((*eps <= 0) || (*eps > 0.01)){
fprintf(stderr, "Error: epsilon must be between 0.0000000001 and 0.01 )\n"); fprintf(stderr, "Error: epsilon must be between 0.0000000001 and 0.01 )\n");
...@@ -39,8 +42,8 @@ void Process_Args(int argc, char **argv, int *m, int *n, double *eps, double *de ...@@ -39,8 +42,8 @@ void Process_Args(int argc, char **argv, int *m, int *n, double *eps, double *de
/* /*
** Viertes (optionales) Argument: delta_t ** Viertes (optionales) Argument: delta_t
*/ */
if (argc >= 5) { if (argc >= 6) {
*delta_t = atof(argv[4]); *delta_t = atof(argv[5]);
} }
if ((*delta_t <= 0) || (*delta_t > 1.0)){ if ((*delta_t <= 0) || (*delta_t > 1.0)){
fprintf(stderr, "Error: delta_t (%f) must be between 0.0000000001 and 1.0\n", *delta_t); fprintf(stderr, "Error: delta_t (%f) must be between 0.0000000001 and 1.0\n", *delta_t);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include <mpi.h> #include <mpi.h>
#include <sys/time.h> #include <sys/time.h>
#include "project.h" #include "project.h"
#include "omp.h"
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
...@@ -14,6 +15,7 @@ int main(int argc, char **argv) ...@@ -14,6 +15,7 @@ int main(int argc, char **argv)
double delta_t = 0.000001; double delta_t = 0.000001;
double alpha = 1; double alpha = 1;
int dim0_size, dim1_size; int dim0_size, dim1_size;
int num_threads;
double **root_field; // complete field owned by root double **root_field; // complete field owned by root
double **partial_field; // partial field where process works on double **partial_field; // partial field where process works on
double **partial_field_clipboard; // copy of partial field double **partial_field_clipboard; // copy of partial field
...@@ -33,7 +35,10 @@ int main(int argc, char **argv) ...@@ -33,7 +35,10 @@ int main(int argc, char **argv)
MPI_Init(&argc, &argv); MPI_Init(&argc, &argv);
Process_Args(argc, argv, &dim0_size, &dim1_size, &eps, &delta_t); Process_Args(argc, argv, &num_threads, &dim0_size, &dim1_size, &eps, &delta_t);
printf("%d threads per process\n", num_threads);
omp_set_num_threads(num_threads);
int rank, cart_cluster_size; int rank, cart_cluster_size;
if(MPI_Comm_rank(MPI_COMM_WORLD, &rank)) { if(MPI_Comm_rank(MPI_COMM_WORLD, &rank)) {
......
...@@ -19,7 +19,7 @@ void Insert_Matrix(double **a, int a_dim0, int a_dim1, int pos_dim0, int pos_dim ...@@ -19,7 +19,7 @@ void Insert_Matrix(double **a, int a_dim0, int a_dim1, int pos_dim0, int pos_dim
void Insert_Array_In_Matrix(double **a, int a_dim0, int a_dim1, int pos_dim0, int pos_dim1, double *b, int b_dim0, int b_dim1, int offset_top, int offset_right, int offset_bottom, int offset_left); void Insert_Array_In_Matrix(double **a, int a_dim0, int a_dim1, int pos_dim0, int pos_dim1, double *b, int b_dim0, int b_dim1, int offset_top, int offset_right, int offset_bottom, int offset_left);
// args.c // args.c
void Process_Args(int argc, char **argv, int *m, int *n, double *eps, double *delta_t); void Process_Args(int argc, char **argv, int *num_threads, int *m, int *n, double *eps, double *delta_t);
// mpi_util.c // mpi_util.c
void Create_MPI_Type_t_process_info(MPI_Datatype *datatype); void Create_MPI_Type_t_process_info(MPI_Datatype *datatype);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment