int main(int argc, char **argv) { ESL_GETOPTS *go = NULL; ESL_STOPWATCH *w = esl_stopwatch_Create(); struct cfg_s cfg; p7_Init(); /* Process command line options. */ go = esl_getopts_Create(options); if (esl_opt_ProcessCmdline(go, argc, argv) != eslOK || esl_opt_VerifyConfig(go) != eslOK) { printf("Failed to parse command line: %s\n", go->errbuf); esl_usage(stdout, argv[0], usage); printf("\nTo see more help on available options, do %s -h\n\n", argv[0]); exit(1); } if (esl_opt_GetBoolean(go, "-h") == TRUE) { p7_banner(stdout, argv[0], banner); esl_usage(stdout, argv[0], usage); puts("\nCommon options:"); esl_opt_DisplayHelp(stdout, go, 1, 2, 80); /* 1=docgroup, 2 = indentation; 80=textwidth*/ puts("\nChoice of score type :"); esl_opt_DisplayHelp(stdout, go, 2, 2, 80); puts("\nChoice of alignment mode :"); esl_opt_DisplayHelp(stdout, go, 3, 2, 80); puts("\nChoice of multi vs. unihit config :"); esl_opt_DisplayHelp(stdout, go, 4, 2, 80); puts("\nChoice of generic vs. vector DP implementation :"); esl_opt_DisplayHelp(stdout, go, 5, 2, 80); puts("\nOutput options (use only in serial mode, for single HMM input):"); esl_opt_DisplayHelp(stdout, go, 6, 2, 80); puts("\nControlling range of fitted tail masses :"); esl_opt_DisplayHelp(stdout, go, 7, 2, 80); puts("\nRecalibrating E-values, and replacing HMM's existing parameters :"); esl_opt_DisplayHelp(stdout, go, 8, 2, 80); puts("\nDebugging :"); esl_opt_DisplayHelp(stdout, go, 9, 2, 80); puts("\nExperiments :"); esl_opt_DisplayHelp(stdout, go, 10, 2, 80); exit(0); } if (esl_opt_ArgNumber(go) != 1) { puts("Incorrect number of command line arguments."); esl_usage(stdout, argv[0], usage); puts("\nwhere general options are:"); esl_opt_DisplayHelp(stdout, go, 1, 2, 80); /* 1=docgroup, 2 = indentation; 80=textwidth*/ printf("\nTo see more help on available options, do %s -h\n\n", argv[0]); exit(1); } /* Validate combinations of score/config/implementation (4x3x2x2, score x mode x hit x DPimpl: 20 of 48 possible combos valid */ if (esl_opt_GetBoolean(go, "--vector") && ! esl_opt_GetBoolean(go, "--local")) p7_Fail("SIMD vector implementations only work for local alignment."); /* -16/48 */ if (esl_opt_GetBoolean(go, "--msv") && ! esl_opt_GetBoolean(go, "--local")) p7_Fail("MSV scoring is local by definition: use --local."); /* -4/48 */ if (esl_opt_GetBoolean(go, "--vit") && ! esl_opt_GetBoolean(go, "--local")) p7_Fail("no p7_GViterbiDual for new dual-mode profile implemented yet"); /* -4/48 */ /* Initialize configuration shared across all kinds of masters * and workers in this .c file. */ cfg.hmmfile = esl_opt_GetArg(go, 1); cfg.r = esl_randomness_Create(esl_opt_GetInteger(go, "--seed")); // cfg.abc = esl_alphabet_Create(eslAMINO); cfg.my_rank = 0; /* MPI init will change this soon, if --mpi was set */ cfg.nproc = 0; /* MPI init will change this soon, if --mpi was set */ cfg.do_mpi = FALSE; /* --mpi will change this soon (below) if necessary */ cfg.do_stall = esl_opt_GetBoolean(go, "--stall"); cfg.N = esl_opt_GetInteger(go, "-N"); cfg.L = esl_opt_GetInteger(go, "-L"); cfg.hfp = NULL; cfg.ofp = NULL; cfg.survfp = NULL; cfg.efp = NULL; cfg.ffp = NULL; cfg.xfp = NULL; cfg.alfp = NULL; cfg.bg = NULL; /* This is our stall point, if we need to wait until we get a * debugger attached to this process for debugging (especially * useful for MPI): */ while (cfg.do_stall); /* Start timing. */ esl_stopwatch_Start(w); /* Main body: * Handed off to serial version or MPI masters and workers as appropriate. */ #ifdef HAVE_MPI if (esl_opt_GetBoolean(go, "--mpi")) { /* Initialize MPI, figure out who we are, and whether we're running * this show (proc 0) or working in it (procs >0). */ cfg.do_mpi = TRUE; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &(cfg.my_rank)); MPI_Comm_size(MPI_COMM_WORLD, &(cfg.nproc)); if (cfg.my_rank == 0 && cfg.nproc < 2) p7_Fail("Need at least 2 MPI processes to run --mpi mode."); if (cfg.my_rank > 0) mpi_worker(go, &cfg); else mpi_master(go, &cfg); esl_stopwatch_Stop(w); esl_stopwatch_MPIReduce(w, 0, MPI_COMM_WORLD); MPI_Finalize(); /* both workers and masters reach this line */ } else #endif /*HAVE_MPI*/ { /* No MPI? Then we're just the serial master. */ serial_master(go, &cfg); esl_stopwatch_Stop(w); } /* Stop timing. */ if (cfg.my_rank == 0) esl_stopwatch_Display(stdout, w, "# CPU time: "); /* Clean up and exit. */ if (cfg.my_rank == 0) { if (cfg.hfp != NULL) p7_hmmfile_Close(cfg.hfp); if (esl_opt_IsOn(go, "-o")) fclose(cfg.ofp); if (cfg.survfp != NULL) fclose(cfg.survfp); if (cfg.efp != NULL) fclose(cfg.efp); if (cfg.ffp != NULL) fclose(cfg.ffp); if (cfg.xfp != NULL) fclose(cfg.xfp); if (cfg.alfp != NULL) fclose(cfg.alfp); } p7_bg_Destroy(cfg.bg); esl_alphabet_Destroy(cfg.abc); esl_randomness_Destroy(cfg.r); esl_getopts_Destroy(go); esl_stopwatch_Destroy(w); return eslOK; }
int main(int argc, char **argv) { ESL_GETOPTS *go = NULL; /* command line processing */ ESL_STOPWATCH *w = esl_stopwatch_Create(); struct cfg_s cfg; /* Set processor specific flags */ impl_Init(); cfg.alifile = NULL; cfg.hmmfile = NULL; /* Parse the command line */ process_commandline(argc, argv, &go, &cfg.hmmfile, &cfg.alifile); /* Initialize what we can in the config structure (without knowing the alphabet yet) */ cfg.ofp = NULL; /* opened in init_master_cfg() */ cfg.fmt = eslMSAFILE_UNKNOWN; /* autodetect alignment format by default. */ cfg.afp = NULL; /* created in init_master_cfg() */ cfg.abc = NULL; /* created in init_master_cfg() in masters, or in mpi_worker() in workers */ cfg.hmmfp = NULL; /* opened in init_master_cfg() */ cfg.postmsafile = esl_opt_GetString(go, "-O"); /* NULL by default */ cfg.postmsafp = NULL; /* opened in init_master_cfg() */ cfg.nali = 0; /* this counter is incremented in masters */ cfg.nnamed = 0; /* 0 or 1 if a single MSA; == nali if multiple MSAs */ cfg.do_mpi = FALSE; /* this gets reset below, if we init MPI */ cfg.nproc = 0; /* this gets reset below, if we init MPI */ cfg.my_rank = 0; /* this gets reset below, if we init MPI */ cfg.do_stall = esl_opt_GetBoolean(go, "--stall"); cfg.hmmName = esl_opt_GetString(go, "-n"); /* NULL by default */ if (esl_opt_IsOn(go, "--informat")) { cfg.fmt = esl_msa_EncodeFormat(esl_opt_GetString(go, "--informat")); if (cfg.fmt == eslMSAFILE_UNKNOWN) p7_Fail("%s is not a recognized input sequence file format\n", esl_opt_GetString(go, "--informat")); } /* This is our stall point, if we need to wait until we get a * debugger attached to this process for debugging (especially * useful for MPI): */ while (cfg.do_stall); /* Start timing. */ esl_stopwatch_Start(w); /* Figure out who we are, and send control there: * we might be an MPI master, an MPI worker, or a serial program. */ #ifdef HAVE_MPI if (esl_opt_GetBoolean(go, "--mpi")) { cfg.do_mpi = TRUE; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &(cfg.my_rank)); MPI_Comm_size(MPI_COMM_WORLD, &(cfg.nproc)); if (cfg.my_rank > 0) mpi_worker(go, &cfg); else mpi_master(go, &cfg); esl_stopwatch_Stop(w); esl_stopwatch_MPIReduce(w, 0, MPI_COMM_WORLD); MPI_Finalize(); } else #endif /*HAVE_MPI*/ { serial_master(go, &cfg); esl_stopwatch_Stop(w); } if (cfg.my_rank == 0) { fputc('\n', cfg.ofp); esl_stopwatch_Display(cfg.ofp, w, "# CPU time: "); } /* Clean up the shared cfg. */ if (cfg.my_rank == 0) { if (esl_opt_IsOn(go, "-o")) { fclose(cfg.ofp); } if (cfg.afp != NULL) esl_msafile_Close(cfg.afp); if (cfg.abc != NULL) esl_alphabet_Destroy(cfg.abc); if (cfg.hmmfp != NULL) fclose(cfg.hmmfp); } esl_getopts_Destroy(go); esl_stopwatch_Destroy(w); return 0; }
int main(int argc, char **argv){ int i,j; /* initialize MPI */ int rc = MPI_Init(&argc, &argv); if(rc != MPI_SUCCESS){ printf ("Error starting MPI program. Terminating.\n"); MPI_Abort (MPI_COMM_WORLD, rc); } /* get MPI environment */ MPI_Comm_size (MPI_COMM_WORLD, &task_num); MPI_Comm_rank (MPI_COMM_WORLD, &rank); /* check and load arguements */ if(argc != 9){ printf("arguements error\n"); exit(EXIT_FAILURE); } load_args(argv); x_enable = (rank == 0) ? x_enable : 0; // only rank 0 (master) use X window /* initialize X window */ if(x_enable){ init_X(); XFlush(X.display); } /* start mandelbrot set test for every pixel */ pixel_value = malloc_2d_int(point_num_x, point_num_y); node_time = (double*)malloc(task_num * sizeof(double)); double begin = MPI_Wtime(); if(rank == 0){ mpi_master(); } else{ mpi_slaver(); } double end = MPI_Wtime(); total_time = end - begin; if(rank == 0){ printf("(N,Total"); for(i=0; i<task_num; i++){ printf(",N%d", i+1); } printf(")->(%d,%lf", point_num_x*point_num_y, total_time); for(i=0; i<task_num; i++){ printf(",%lf", node_time[i]); } printf(")\n"); } free(node_time); free_2d_int(pixel_value, point_num_x); /* show result */ if(x_enable){ sleep(3); } MPI_Finalize(); }