Remove one useless test.
This commit was SVN r10004.
Этот коммит содержится в:
родитель
eb149cb9c8
Коммит
6df7bf1a0f
@ -1,432 +0,0 @@
|
|||||||
/*-----------------------------------------------------------------------------
|
|
||||||
MESSAGE PASSING INTERFACE TEST CASE SUITE
|
|
||||||
|
|
||||||
Copyright - 1996 Intel Corporation
|
|
||||||
|
|
||||||
Intel Corporation hereby grants a non-exclusive license under Intel's
|
|
||||||
copyright to copy, modify and distribute this software for any purpose
|
|
||||||
and without fee, provided that the above copyright notice and the following
|
|
||||||
paragraphs appear on all copies.
|
|
||||||
|
|
||||||
Intel Corporation makes no representation that the test cases comprising
|
|
||||||
this suite are correct or are an accurate representation of any standard.
|
|
||||||
|
|
||||||
IN NO EVENT SHALL INTEL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT OR
|
|
||||||
SPECULATIVE DAMAGES, (INCLUDING WITHOUT LIMITING THE FOREGOING, CONSEQUENTIAL,
|
|
||||||
INCIDENTAL AND SPECIAL DAMAGES) INCLUDING, BUT NOT LIMITED TO INFRINGEMENT,
|
|
||||||
LOSS OF USE, BUSINESS INTERRUPTIONS, AND LOSS OF PROFITS, IRRESPECTIVE OF
|
|
||||||
WHETHER INTEL HAS ADVANCE NOTICE OF THE POSSIBILITY OF ANY SUCH DAMAGES.
|
|
||||||
|
|
||||||
INTEL CORPORATION SPECIFICALLY DISCLAIMS ANY WARRANTIES INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE AND NON-INFRINGEMENT. THE SOFTWARE PROVIDED HEREUNDER
|
|
||||||
IS ON AN "AS IS" BASIS AND INTEL CORPORATION HAS NO OBLIGATION TO PROVIDE
|
|
||||||
MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR MODIFICATIONS.
|
|
||||||
-----------------------------------------------------------------------------*/
|
|
||||||
/******************************************************************************
|
|
||||||
Test for MPI_Send(): All others Send TO Root
|
|
||||||
and MPI_Recv(): Any source/Any tag
|
|
||||||
|
|
||||||
Tests the basic blocking MPI_Send operation, for both Intra and Inter
|
|
||||||
communicators, as well as MPI_Recv using MPI_ANY_SOURCE and MPI_ANY_TAG.
|
|
||||||
|
|
||||||
For an INTRA-communicator, the program selects each node, in turn,
|
|
||||||
of the communicator to be the root. the ROOT receives from all of the
|
|
||||||
other nodes (it does NOT receive from itself).
|
|
||||||
|
|
||||||
For an INTER-communicator, there are two groups of nodes; each group being
|
|
||||||
termed a sub-communicator. The nodes in each sub-communicator are numbered
|
|
||||||
0 to (k-1) for a k-node sub-communicator. So,the MPITEST_current_rank will
|
|
||||||
return duplicate node numbers for nodes (0 to k-1) where k is the number of
|
|
||||||
nodes in the smaller communicator.
|
|
||||||
|
|
||||||
The program cycles through the nodes in one sub-communicator, with each
|
|
||||||
selected node receiving from all of the nodes in the other sub-communicator.
|
|
||||||
Then the program reverses the send and receive role of the
|
|
||||||
two sub-communicators, and repeats the process.
|
|
||||||
|
|
||||||
This test initializes the send buffer starting with the root's rank in the
|
|
||||||
communicator (or an appropriate value for the non-integer types.)
|
|
||||||
Once the receiving nodes have completed their message receive, they check to
|
|
||||||
make sure the current root's rank is in the received buffer.
|
|
||||||
|
|
||||||
This test may be run in any communicator, with any data type, and with
|
|
||||||
any non-negative message length.
|
|
||||||
|
|
||||||
The MPITEST environment provides looping over communicator size and
|
|
||||||
type, message length, and data type. The properties of the loops are
|
|
||||||
encoded in configuration arrays in the file mpitest_cfg.h . See the
|
|
||||||
MPITEST README for further details.
|
|
||||||
******************************************************************************/
|
|
||||||
|
|
||||||
#include "ompi_config.h"
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include "ompi/datatype/datatype.h"
|
|
||||||
#include "ompi/datatype/datatype_internal.h"
|
|
||||||
#include "ompi/datatype/convertor.h"
|
|
||||||
#include "mpitest_cfg.h"
|
|
||||||
#include "mpitest.h"
|
|
||||||
|
|
||||||
/* Compile with:
|
|
||||||
mpicc -DHAVE_CONFIG_H -I. -I../../include -I../../../ompi-trunk/include -I../.. -I../../include -I../../../ompi-trunk/opal -I../../../ompi-trunk/orte -I../../../ompi-trunk/ompi -g mpi_test.c -o mpi_test ~/ompi-tests/intel_tests/src/libmpitest.o -I../../../ompi-tests/intel_tests/src
|
|
||||||
*/
|
|
||||||
main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
int
|
|
||||||
berr, /* error flag for buffer ATTACH and DETACH */
|
|
||||||
byte_length, /* The length of the current buffer in bytes */
|
|
||||||
cnt_len, /* received length returned by MPI_Get_Count */
|
|
||||||
comm_count, /* loop counter for communicator loop */
|
|
||||||
comm_index, /* the array index of the current comm */
|
|
||||||
comm_type, /* the index of the current communicator type */
|
|
||||||
error, /* errors from one MPI call */
|
|
||||||
fail, /* counts total number of failures */
|
|
||||||
loop_fail, /* counts number of failures in one loop */
|
|
||||||
get_from, /* Number of nodes sending current message */
|
|
||||||
grp_lup, /* index for comm groups (1 to ntimes) */
|
|
||||||
i, j, /* utility loop index variables */
|
|
||||||
ierr, /* return value from MPI calls */
|
|
||||||
inter_comm, /* flag, true, if intercommunicator */
|
|
||||||
left_recv_size, /* Left Intercommunictor receive size */
|
|
||||||
left_send_size, /* Left Intercommunicator send size */
|
|
||||||
length, /* The length of the current buffer */
|
|
||||||
length_count, /* loop counter for message length loop */
|
|
||||||
loop_cnt, /* counts total number of loops through test */
|
|
||||||
max_byte_length, /* maximum buffer length in bytes */
|
|
||||||
max_length, /* max buffer length specified in config. file */
|
|
||||||
ntimes, /* # of communicator groups INTRA=1, INTER=2 */
|
|
||||||
print_node_flag, /* node 0 of INTRA, node 0 of left comm of INTER */
|
|
||||||
receivers, /* INTER-comm #receivers for this send/rec choice */
|
|
||||||
recv_group, /* INTER-comm test receiving group(0 or 1) */
|
|
||||||
recv_size, /* INTER receive size MPI_Comm_remote_size */
|
|
||||||
right_recv_size, /* INTER: absolute count of right receive * nodes */
|
|
||||||
right_send_size, /* INTER: count of right sending nodes */
|
|
||||||
root, /* the root of the current broadcast */
|
|
||||||
send_group, /* INTER-comm test sending group #(0 or 1) */
|
|
||||||
send_size, /* INTER: relative send size from MPI_Comm_size */
|
|
||||||
senders, /* INTER-comm #senders for this send/rec choice */
|
|
||||||
size, /* return size from MPI_Error_string */
|
|
||||||
test_nump, /* The number of nodes in current communicator */
|
|
||||||
test_type, /* the index of the current buffer type */
|
|
||||||
type_count; /* loop counter for data type loop */
|
|
||||||
|
|
||||||
|
|
||||||
struct dataTemplate
|
|
||||||
value; /* dataTemplate for initializing buffers */
|
|
||||||
|
|
||||||
void *recv_buffer;
|
|
||||||
void *send_buffer; /* message buffer */
|
|
||||||
|
|
||||||
char
|
|
||||||
info_buf[256], /* buffer for passing mesages to MPITEST */
|
|
||||||
testname[64]; /* the name of this test */
|
|
||||||
|
|
||||||
MPI_Comm comm, /* MPI communicator */
|
|
||||||
barrier_comm; /* If intercommunicator, merged comm for Barrier */
|
|
||||||
|
|
||||||
MPI_Status recv_stat; /* MPI status structure */
|
|
||||||
|
|
||||||
/*----------------------------- MPI_Init ------------------------------*/
|
|
||||||
ierr = MPI_Init(&argc, &argv);
|
|
||||||
if (ierr != MPI_SUCCESS) {
|
|
||||||
sprintf(info_buf, "Non-zero return code (%d) from MPI_Init()",
|
|
||||||
ierr);
|
|
||||||
MPITEST_message(MPITEST_FATAL, info_buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
sprintf(testname, "MPI_convertor_c: Datatype convertor test");
|
|
||||||
|
|
||||||
/*----------------------------- MPITEST_init --------------------------*/
|
|
||||||
MPITEST_init(argc, argv);
|
|
||||||
if (MPITEST_me == 0) {
|
|
||||||
sprintf(info_buf, "Starting %s test", testname);
|
|
||||||
MPITEST_message(MPITEST_INFO0, info_buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* set the global error counter */
|
|
||||||
fail = 0;
|
|
||||||
loop_fail = 0;
|
|
||||||
loop_cnt = 0;
|
|
||||||
|
|
||||||
max_byte_length = MPITEST_get_max_message_length();
|
|
||||||
|
|
||||||
/*-------------------------- Loop over Communicators ------------------*/
|
|
||||||
|
|
||||||
for (comm_count = 0; comm_count < 2 /*MPITEST_num_comm_sizes()*/;
|
|
||||||
comm_count++) {
|
|
||||||
comm_index = MPITEST_get_comm_index(comm_count);
|
|
||||||
comm_type = MPITEST_get_comm_type(comm_count);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Reset a bunch of variables that will be set when we get our
|
|
||||||
* communicator. These are mainly variables for determining
|
|
||||||
* sub-communicator, left or right, when we get an INTER-communicator.
|
|
||||||
*/
|
|
||||||
|
|
||||||
left_send_size = -1;
|
|
||||||
left_recv_size = -1;
|
|
||||||
right_send_size = -1;
|
|
||||||
right_recv_size = -1;
|
|
||||||
send_size = -1;
|
|
||||||
recv_size = -1;
|
|
||||||
|
|
||||||
inter_comm = -1;
|
|
||||||
print_node_flag = 0;
|
|
||||||
|
|
||||||
test_nump = MPITEST_get_communicator(comm_type, comm_index, &comm);
|
|
||||||
|
|
||||||
/* Skip everything if not a member of this communicator */
|
|
||||||
if (MPITEST_current_rank != MPI_UNDEFINED) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Test if INTER-communicator: inter_comm is true if this is an
|
|
||||||
* inter-communicator
|
|
||||||
*/
|
|
||||||
|
|
||||||
MPI_Comm_test_inter(comm, &inter_comm);
|
|
||||||
/*
|
|
||||||
* Variables, send_size, and recv_size both default to the total
|
|
||||||
* nodes in the communicator for an INTRA-communicator For an
|
|
||||||
* INTER-communicator: MPI_Comm_size returns the size of the
|
|
||||||
* communicator for all of the nodes in each respective communicator
|
|
||||||
* MPI_Comm_remote_size returns the size of the opposite
|
|
||||||
* communicator for all nodes in each respective communicator
|
|
||||||
*
|
|
||||||
* Set the print_node_flag: This flag tells which node gets
|
|
||||||
* to print. For INTRA-communition it is simply node 0. For
|
|
||||||
* INTER-communication it is node zero of the left group.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (inter_comm) { /* Do this stuff for INTER-communicators */
|
|
||||||
|
|
||||||
if (MPITEST_inter == 0) { /* Do this stuff for left group of an INTER-communicator */
|
|
||||||
MPI_Comm_size(comm, &send_size);
|
|
||||||
MPI_Comm_remote_size(comm, &recv_size);
|
|
||||||
|
|
||||||
left_send_size = send_size;
|
|
||||||
left_recv_size = recv_size;
|
|
||||||
right_send_size = recv_size;
|
|
||||||
right_recv_size = send_size;
|
|
||||||
|
|
||||||
if (MPITEST_current_rank == 0) { /* Do for node zero of left bank of INTER-communicator */
|
|
||||||
print_node_flag = 1;
|
|
||||||
}
|
|
||||||
/* End of INTER-communicator left group node zero */
|
|
||||||
ierr = MPI_Intercomm_merge(comm, FALSE, &barrier_comm);
|
|
||||||
if (ierr != MPI_SUCCESS) {
|
|
||||||
sprintf(info_buf,
|
|
||||||
"Non-zero return code (%d) from MPI_Intercomm_merge",
|
|
||||||
ierr);
|
|
||||||
MPITEST_message(MPITEST_NONFATAL, info_buf);
|
|
||||||
MPI_Error_string(ierr, &info_buf[0], &size);
|
|
||||||
MPITEST_message(MPITEST_FATAL, info_buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
/* End of INTER-communicator left group */
|
|
||||||
if (MPITEST_inter == 1) { /* Do this for right group of an INTER-communicator */
|
|
||||||
MPI_Comm_size(comm, &send_size);
|
|
||||||
MPI_Comm_remote_size(comm, &recv_size);
|
|
||||||
|
|
||||||
left_send_size = recv_size;
|
|
||||||
left_recv_size = send_size;
|
|
||||||
right_send_size = send_size;
|
|
||||||
right_recv_size = recv_size;
|
|
||||||
|
|
||||||
ierr = MPI_Intercomm_merge(comm, FALSE, &barrier_comm);
|
|
||||||
if (ierr != MPI_SUCCESS) {
|
|
||||||
sprintf(info_buf,
|
|
||||||
"Non-zero return code (%d) from MPI_Intercomm_merge",
|
|
||||||
ierr);
|
|
||||||
MPITEST_message(MPITEST_NONFATAL, info_buf);
|
|
||||||
MPI_Error_string(ierr, &info_buf[0], &size);
|
|
||||||
MPITEST_message(MPITEST_FATAL, info_buf);
|
|
||||||
}
|
|
||||||
} /* End of INTER_communicator right group */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* End of INTER_communicator */
|
|
||||||
/* Do for INTRA-communicator */
|
|
||||||
if (!inter_comm) {
|
|
||||||
if (MPITEST_current_rank == 0)
|
|
||||||
print_node_flag = 1;
|
|
||||||
barrier_comm = comm;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*------------------ Loop over Data Types ---------------------*/
|
|
||||||
|
|
||||||
for (type_count = 0; type_count < MPITEST_num_datatypes();
|
|
||||||
type_count++) {
|
|
||||||
test_type = MPITEST_get_datatype(type_count);
|
|
||||||
|
|
||||||
/* convert the number of bytes in the maximum length message */
|
|
||||||
/* into the number of elements of the current type */
|
|
||||||
|
|
||||||
max_length =
|
|
||||||
MPITEST_byte_to_element(test_type, max_byte_length);
|
|
||||||
|
|
||||||
/* Allocate send and receive Buffers */
|
|
||||||
MPITEST_get_buffer(test_type, max_length, &recv_buffer);
|
|
||||||
MPITEST_get_buffer(test_type, max_length, &send_buffer);
|
|
||||||
|
|
||||||
/*------------- Loop over Message Lengths ---------------*/
|
|
||||||
|
|
||||||
for (length_count = 0;
|
|
||||||
length_count < MPITEST_num_message_lengths();
|
|
||||||
length_count++) {
|
|
||||||
byte_length = MPITEST_get_message_length(length_count);
|
|
||||||
length = MPITEST_byte_to_element(test_type, byte_length);
|
|
||||||
ompi_convertor_t *send_conv = ompi_convertor_create(0,0);
|
|
||||||
ompi_convertor_t *recv_conv = ompi_convertor_create(0,0);
|
|
||||||
char eager[1024];
|
|
||||||
char max_send[8192];
|
|
||||||
struct iovec iov;
|
|
||||||
uint32_t iov_count;
|
|
||||||
int32_t free_after;
|
|
||||||
size_t max_data_pack;
|
|
||||||
size_t max_data_unpack;
|
|
||||||
size_t bytes_remaining;
|
|
||||||
|
|
||||||
loop_cnt++; /* increase the number of runned tests */
|
|
||||||
|
|
||||||
/* Initialize send buffer */
|
|
||||||
MPITEST_dataTemplate_init(&value, MPITEST_current_rank);
|
|
||||||
MPITEST_init_buffer_inc(test_type, length + 1, value, send_buffer);
|
|
||||||
|
|
||||||
/* Initialize recv buffer */
|
|
||||||
MPITEST_dataTemplate_init(&value, -1);
|
|
||||||
MPITEST_init_buffer(test_type, length + 1, value, recv_buffer);
|
|
||||||
|
|
||||||
/* Initialize convertors */
|
|
||||||
ompi_convertor_prepare_for_send(send_conv, MPITEST_mpi_datatypes[test_type],
|
|
||||||
length, send_buffer);
|
|
||||||
ompi_convertor_get_packed_size(send_conv, &bytes_remaining);
|
|
||||||
ompi_convertor_prepare_for_recv(recv_conv, MPITEST_mpi_datatypes[test_type],
|
|
||||||
length, recv_buffer);
|
|
||||||
|
|
||||||
if(bytes_remaining > sizeof(eager))
|
|
||||||
max_data_pack = sizeof(eager);
|
|
||||||
else
|
|
||||||
max_data_pack = bytes_remaining;
|
|
||||||
|
|
||||||
iov.iov_base = eager;
|
|
||||||
iov.iov_len = max_data_pack;
|
|
||||||
iov_count = 1;
|
|
||||||
ompi_convertor_pack(send_conv, &iov, &iov_count, &max_data, &free_after);
|
|
||||||
bytes_remaining -= max_data_pack; /* sender schedules data */
|
|
||||||
|
|
||||||
iov.iov_base = eager;
|
|
||||||
iov.iov_len = max_data_pack;
|
|
||||||
max_data_unpack = max_data_pack;
|
|
||||||
ompi_convertor_unpack(recv_conv, &iov, &iov_count, &max_data, &free_after);
|
|
||||||
|
|
||||||
if (max_data_pack != max_data_unpack) {
|
|
||||||
fprintf(stderr, "pack/unpack count mismatch: %lu != !lu\n", max_data_pack, max_data_unpack);
|
|
||||||
}
|
|
||||||
|
|
||||||
while(bytes_remaining != 0) {
|
|
||||||
if(bytes_remaining > sizeof(max_send)) {
|
|
||||||
max_data = sizeof(max_send);
|
|
||||||
} else {
|
|
||||||
max_data = bytes_remaining;
|
|
||||||
}
|
|
||||||
|
|
||||||
iov.iov_base = max_send;
|
|
||||||
iov.iov_len = max_data;
|
|
||||||
iov_count = 1;
|
|
||||||
|
|
||||||
ompi_convertor_pack(send_conv, &iov, &iov_count, &max_data, &free_after);
|
|
||||||
bytes_remaining -= max_data;
|
|
||||||
|
|
||||||
iov.iov_base = max_send;
|
|
||||||
iov.iov_len = max_data_pack;
|
|
||||||
iov_count = 1;
|
|
||||||
max_data_unpack = max_data_pack;
|
|
||||||
ompi_convertor_unpack(recv_conv, &iov, &iov_count, &max_data_unpack, &free_after);
|
|
||||||
|
|
||||||
if (max_data_pack != max_data_unpack) {
|
|
||||||
fprintf(stderr, "pack/unpack count mismatch: %lu != !lu\n", max_data_pack, max_data_unpack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Error Test */
|
|
||||||
/*
|
|
||||||
* Set up the dataTemplate for checking the
|
|
||||||
* recv'd buffer. Note that the sending
|
|
||||||
* node rank will be sent.
|
|
||||||
*/
|
|
||||||
MPITEST_dataTemplate_init(&value, MPITEST_current_rank);
|
|
||||||
error = MPITEST_buffer_errors_inc
|
|
||||||
(test_type, length, value,
|
|
||||||
recv_buffer);
|
|
||||||
|
|
||||||
/* check for receive buffer overflow */
|
|
||||||
MPITEST_dataTemplate_init(&value, -1);
|
|
||||||
|
|
||||||
error += MPITEST_buffer_errors_ov(test_type,
|
|
||||||
length,
|
|
||||||
value,
|
|
||||||
recv_buffer);
|
|
||||||
|
|
||||||
if (error) {
|
|
||||||
sprintf(info_buf,
|
|
||||||
"%d errors in buffer (%d,%d,%d) len %d commsize %d commtype %d data_type %d root %d",
|
|
||||||
error, length_count,
|
|
||||||
comm_count, type_count,
|
|
||||||
length, test_nump,
|
|
||||||
comm_type, test_type,
|
|
||||||
root);
|
|
||||||
MPITEST_message(MPITEST_NONFATAL,
|
|
||||||
info_buf);
|
|
||||||
loop_fail++;
|
|
||||||
fail += error;
|
|
||||||
}
|
|
||||||
} /* Loop over Message Lengths */
|
|
||||||
|
|
||||||
free(send_buffer);
|
|
||||||
free(recv_buffer);
|
|
||||||
|
|
||||||
} /* Loop over Data Types */
|
|
||||||
|
|
||||||
if (inter_comm) {
|
|
||||||
ierr = MPI_Comm_free(&barrier_comm);
|
|
||||||
if (ierr != MPI_SUCCESS) {
|
|
||||||
sprintf(info_buf,
|
|
||||||
"Non-zero return code (%d) from MPI_Comm_free",
|
|
||||||
ierr);
|
|
||||||
MPITEST_message(MPITEST_NONFATAL, info_buf);
|
|
||||||
MPI_Error_string(ierr, &info_buf[0], &size);
|
|
||||||
MPITEST_message(MPITEST_FATAL, info_buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/* node rank not defined for this communicator */
|
|
||||||
MPITEST_free_communicator(comm_type, &comm);
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* With the current design of the program, we skip all the code for the
|
|
||||||
* nodes that are not members of the communicator, so this is the first
|
|
||||||
* point that we can place a barrier
|
|
||||||
*/
|
|
||||||
MPI_Barrier(MPI_COMM_WORLD);
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
} /* Loop over Communicators */
|
|
||||||
|
|
||||||
/* report overall results */
|
|
||||||
|
|
||||||
MPITEST_report(loop_cnt - loop_fail, loop_fail, 0, testname);
|
|
||||||
|
|
||||||
MPI_Finalize();
|
|
||||||
|
|
||||||
return fail;
|
|
||||||
|
|
||||||
} /* main() */
|
|
||||||
|
|
Загрузка…
x
Ссылка в новой задаче
Block a user