Пример #1
0
/*---------------------------------------------------------------------------*/
na_class_t *
NA_Test_client_init(int argc, char *argv[], char *addr_name,
        na_size_t max_addr_name, int *rank)
{
    const char *info_string = NULL;
    na_class_t *na_class = NULL;

    info_string = na_test_gen_config(argc, argv);

#ifdef MERCURY_HAS_PARALLEL_TESTING
    /* Test run in parallel using mpirun so must intialize MPI to get
     * basic setup info etc */
    na_test_mpi_init(NA_FALSE);
#endif

    na_class = NA_Initialize(info_string, NA_FALSE);

    /* Get config from file if self option is not passed */
    if (!na_test_use_self_g) {
        char test_addr_name[NA_TEST_MAX_ADDR_NAME];

        na_test_get_config(test_addr_name, NA_TEST_MAX_ADDR_NAME);

        strncpy(addr_name, test_addr_name,
                (max_addr_name < NA_TEST_MAX_ADDR_NAME) ?
                        max_addr_name : NA_TEST_MAX_ADDR_NAME);
    }

    if (rank) *rank = na_test_comm_rank_g;

    return na_class;
}
Пример #2
0
/*---------------------------------------------------------------------------*/
na_class_t *
NA_Test_server_init(int argc, char *argv[], na_bool_t print_ready,
        char ***addr_table, unsigned int *addr_table_size,
        unsigned int *max_number_of_peers)
{
    na_class_t *na_class = NULL;
    const char *info_string = NULL;

    /* TODO call it once first for now to set static MPI */
    na_test_gen_config(argc, argv);
    na_test_opt_ind_g = 1;

#ifdef MERCURY_HAS_PARALLEL_TESTING
    /* Test run in parallel using mpirun so must intialize MPI to get
     * basic setup info etc */
    na_test_mpi_init(NA_TRUE);
#endif

    info_string = na_test_gen_config(argc, argv);

    na_class = NA_Initialize(info_string, NA_TRUE);

#ifdef NA_HAS_MPI
    if (na_test_use_mpi_g) {
        na_test_set_config(NA_MPI_Get_port_name(na_class));
    } else
#endif
#ifdef NA_HAS_CCI
    if (na_test_use_cci_g) {
	    const char *uri = NA_CCI_Get_port_name(na_class);
	    na_test_set_config(uri);
    } else
#endif
    {
        /* Gather strings and write config */
        na_test_set_config(info_string);
    }

    /* As many entries in addr table as number of server ranks */
    if (addr_table_size) *addr_table_size = na_addr_table_size;

    /* Point addr table to NA MPI addr table */
    if (addr_table) *addr_table = na_addr_table;

#ifdef MERCURY_HAS_PARALLEL_TESTING
    if (max_number_of_peers) *max_number_of_peers = MPIEXEC_MAX_NUMPROCS;
#else
    if (max_number_of_peers) *max_number_of_peers = 1;
#endif

    if (print_ready) {
        /* Used by CTest Test Driver */
        printf("Waiting for client...\n");
        fflush(stdout);
    }

    return na_class;
}
Пример #3
0
/*---------------------------------------------------------------------------*/
na_return_t
NA_Test_init(int argc, char *argv[], struct na_test_info *na_test_info)
{
    char *info_string = NULL;
    struct na_init_info na_init_info;
    na_return_t ret = NA_SUCCESS;

    na_test_parse_options(argc, argv, na_test_info);

#ifdef MERCURY_HAS_PARALLEL_TESTING
    /* Test run in parallel using mpirun so must intialize MPI to get
     * basic setup info etc */
    na_test_mpi_init(na_test_info);
    na_test_info->max_number_of_peers = MPIEXEC_MAX_NUMPROCS;
#else
    na_test_info->mpi_comm_rank = 0;
    na_test_info->mpi_comm_size = 1;
    na_test_info->max_number_of_peers = 1;
#endif

    /* Generate NA init string and get config options */
    info_string = na_test_gen_config(na_test_info);
    if (!info_string) {
        NA_LOG_ERROR("Could not generate config string");
        ret = NA_PROTOCOL_ERROR;
        goto done;
    }

    /* Call cleanup before doing anything */
    if (na_test_info->listen && na_test_info->mpi_comm_rank == 0)
        NA_Cleanup();

    memset(&na_init_info, 0, sizeof(struct na_init_info));
    if (na_test_info->busy_wait) {
        na_init_info.progress_mode = NA_NO_BLOCK;
        printf("# Initializing NA in busy wait mode\n");
    } else
        na_init_info.progress_mode = NA_DEFAULT;
    na_init_info.auth_key = na_test_info->key;
    na_init_info.max_contexts = na_test_info->max_contexts;

    printf("# Using info string: %s\n", info_string);
    na_test_info->na_class = NA_Initialize_opt(info_string,
        na_test_info->listen, &na_init_info);
    if (!na_test_info->na_class) {
        NA_LOG_ERROR("Could not initialize NA");
        ret = NA_PROTOCOL_ERROR;
        goto done;
    }

    if (!na_test_info->extern_init) {
        if (na_test_info->listen) {
            char addr_string[NA_TEST_MAX_ADDR_NAME];
            na_size_t addr_string_len = NA_TEST_MAX_ADDR_NAME;
            na_addr_t self_addr;
            na_return_t nret;

            /* TODO only rank 0 */
            nret = NA_Addr_self(na_test_info->na_class, &self_addr);
            if (nret != NA_SUCCESS) {
                NA_LOG_ERROR("Could not get self addr");
            }

            nret = NA_Addr_to_string(na_test_info->na_class, addr_string,
                &addr_string_len, self_addr);
            if (nret != NA_SUCCESS) {
                NA_LOG_ERROR("Could not convert addr to string");
            }
            NA_Addr_free(na_test_info->na_class, self_addr);

            na_test_set_config(addr_string);

#ifdef MERCURY_HAS_PARALLEL_TESTING
            /* If static client must wait for server to write config file */
            if (na_test_info->mpi_static)
                MPI_Barrier(MPI_COMM_WORLD);
#endif

            /* Used by CTest Test Driver to know when to launch clients */
            MERCURY_TESTING_READY_MSG();
        }
        /* Get config from file if self option is not passed */
        else if (!na_test_info->self_send) {
            char test_addr_name[NA_TEST_MAX_ADDR_NAME] = { '\0' };

#ifdef MERCURY_HAS_PARALLEL_TESTING
            /* If static client must wait for server to write config file */
            if (na_test_info->mpi_static)
                MPI_Barrier(MPI_COMM_WORLD);
#endif
            if (na_test_info->mpi_comm_rank == 0) {
                na_test_get_config(test_addr_name, NA_TEST_MAX_ADDR_NAME);
            }

#ifdef MERCURY_HAS_PARALLEL_TESTING
            /* Broadcast addr name */
            MPI_Bcast(test_addr_name, NA_TEST_MAX_ADDR_NAME, MPI_BYTE, 0,
                na_test_info->mpi_comm);
#endif

            na_test_info->target_name = strdup(test_addr_name);
            printf("# Target name read: %s\n", na_test_info->target_name);
        }
    }

done:
    if (ret != NA_SUCCESS)
        NA_Test_finalize(na_test_info);
    free(info_string);
    return ret;
}