An updated version with a behavior closer to the buffered send.
This commit was SVN r10373.
Этот коммит содержится в:
родитель
cb2f35b875
Коммит
d55783643d
@ -14,55 +14,94 @@
|
|||||||
#include "ompi/datatype/convertor.h"
|
#include "ompi/datatype/convertor.h"
|
||||||
#include "ompi/datatype/datatype.h"
|
#include "ompi/datatype/datatype.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
#define SIZE 1024
|
#define SIZE 1024
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int useful;
|
||||||
|
int useless;
|
||||||
|
} my_data_t;
|
||||||
|
|
||||||
int main( int argc, char* argv[] )
|
int main( int argc, char* argv[] )
|
||||||
{
|
{
|
||||||
MPI_Datatype sparse;
|
MPI_Datatype sparse;
|
||||||
int *array, *sparse_array, *packed;
|
int *array, *packed;
|
||||||
|
my_data_t* sparse_array;
|
||||||
int i;
|
int i;
|
||||||
uint32_t iov_count;
|
uint32_t iov_count;
|
||||||
size_t max_data, position;
|
size_t max_data, position;
|
||||||
int32_t free_after;
|
int32_t free_after;
|
||||||
uint32_t contiguous_checksum, sparse_checksum;
|
uint32_t pack_checksum, contiguous_checksum, sparse_checksum;
|
||||||
struct iovec iov;
|
struct iovec iov;
|
||||||
ompi_convertor_t* convertor;
|
ompi_convertor_t* convertor;
|
||||||
long extent;
|
|
||||||
|
|
||||||
ompi_ddt_init();
|
ompi_ddt_init();
|
||||||
|
srandomdev();
|
||||||
|
|
||||||
ompi_ddt_create_vector( SIZE, 1, 2, MPI_INT, &sparse );
|
ompi_ddt_create_vector( SIZE, 1, 2, MPI_INT, &sparse );
|
||||||
ompi_ddt_commit( &sparse );
|
ompi_ddt_commit( &sparse );
|
||||||
|
|
||||||
ompi_ddt_type_extent( sparse, &extent );
|
sparse_array = (my_data_t*)malloc( sizeof(my_data_t) * SIZE );
|
||||||
|
|
||||||
sparse_array = (int*)malloc( extent );
|
|
||||||
array = (int*)malloc( sizeof(int) * SIZE );
|
array = (int*)malloc( sizeof(int) * SIZE );
|
||||||
packed = (int*)malloc( sizeof(int) * SIZE );
|
packed = (int*)malloc( sizeof(int) * SIZE );
|
||||||
|
|
||||||
for( i = 0; i < SIZE; packed[i] = i, i++ );
|
/**
|
||||||
|
* Initialize the sparse data using the index.
|
||||||
|
*/
|
||||||
|
for( i = 0; i < SIZE; i++ ) {
|
||||||
|
sparse_array[i].useful = random();
|
||||||
|
sparse_array[i].useless = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pack the sparse data into the packed array. This simulate the first step
|
||||||
|
* of the buffered operation.
|
||||||
|
*/
|
||||||
convertor = ompi_convertor_create( ompi_mpi_local_arch, CONVERTOR_WITH_CHECKSUM );
|
convertor = ompi_convertor_create( ompi_mpi_local_arch, CONVERTOR_WITH_CHECKSUM );
|
||||||
position = 0;
|
position = 0;
|
||||||
ompi_convertor_personalize( convertor, CONVERTOR_WITH_CHECKSUM, &position, NULL, NULL );
|
ompi_convertor_personalize( convertor, CONVERTOR_WITH_CHECKSUM, &position, NULL, NULL );
|
||||||
ompi_convertor_prepare_for_recv( convertor, MPI_INT, SIZE, array );
|
ompi_convertor_prepare_for_send( convertor, sparse, SIZE, sparse_array );
|
||||||
|
|
||||||
iov.iov_base = packed;
|
iov.iov_base = packed;
|
||||||
iov.iov_len = sizeof(int) * SIZE;
|
iov.iov_len = sizeof(int) * SIZE;
|
||||||
max_data = iov.iov_len;
|
max_data = iov.iov_len;
|
||||||
|
|
||||||
iov_count = 1;
|
iov_count = 1;
|
||||||
ompi_convertor_unpack( convertor, &iov, &iov_count, &max_data, &free_after );
|
ompi_convertor_pack( convertor, &iov, &iov_count, &max_data, &free_after );
|
||||||
|
pack_checksum = convertor->checksum;
|
||||||
|
|
||||||
|
OBJ_RELEASE(convertor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Now move the data from the packed array into the fragment to
|
||||||
|
* be sent over the network (still simulation).
|
||||||
|
*/
|
||||||
|
convertor = ompi_convertor_create( ompi_mpi_local_arch, CONVERTOR_WITH_CHECKSUM );
|
||||||
|
position = 0;
|
||||||
|
ompi_convertor_personalize( convertor, CONVERTOR_WITH_CHECKSUM, &position, NULL, NULL );
|
||||||
|
ompi_convertor_prepare_for_send( convertor, MPI_INT, SIZE, packed );
|
||||||
|
|
||||||
|
iov.iov_base = array;
|
||||||
|
iov.iov_len = sizeof(int) * SIZE;
|
||||||
|
max_data = iov.iov_len;
|
||||||
|
|
||||||
|
iov_count = 1;
|
||||||
|
ompi_convertor_pack( convertor, &iov, &iov_count, &max_data, &free_after );
|
||||||
contiguous_checksum = convertor->checksum;
|
contiguous_checksum = convertor->checksum;
|
||||||
|
|
||||||
OBJ_RELEASE(convertor);
|
OBJ_RELEASE(convertor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* And now we're on the receiver side. We just get one fragment from
|
||||||
|
* the network and now we unpack it in the user memory.
|
||||||
|
*/
|
||||||
convertor = ompi_convertor_create( ompi_mpi_local_arch, 0 );
|
convertor = ompi_convertor_create( ompi_mpi_local_arch, 0 );
|
||||||
position = 0;
|
position = 0;
|
||||||
ompi_convertor_personalize( convertor, CONVERTOR_WITH_CHECKSUM, &position, NULL, NULL );
|
ompi_convertor_personalize( convertor, CONVERTOR_WITH_CHECKSUM, &position, NULL, NULL );
|
||||||
ompi_convertor_prepare_for_recv( convertor, sparse, SIZE, sparse_array );
|
ompi_convertor_prepare_for_recv( convertor, sparse, SIZE, sparse_array );
|
||||||
|
|
||||||
iov.iov_base = packed;
|
iov.iov_base = array;
|
||||||
iov.iov_len = sizeof(int) * SIZE;
|
iov.iov_len = sizeof(int) * SIZE;
|
||||||
max_data = iov.iov_len;
|
max_data = iov.iov_len;
|
||||||
|
|
||||||
@ -71,16 +110,24 @@ int main( int argc, char* argv[] )
|
|||||||
sparse_checksum = convertor->checksum;
|
sparse_checksum = convertor->checksum;
|
||||||
|
|
||||||
OBJ_RELEASE(convertor);
|
OBJ_RELEASE(convertor);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The datatype is not usefull anymore
|
||||||
|
*/
|
||||||
OBJ_RELEASE(sparse);
|
OBJ_RELEASE(sparse);
|
||||||
|
|
||||||
if( sparse_checksum != contiguous_checksum ) {
|
/**
|
||||||
|
* The 3 checksum have to match.
|
||||||
|
*/
|
||||||
|
printf( "contiguous checksum %x\n", contiguous_checksum );
|
||||||
|
printf( "packed checksum %x\n", pack_checksum );
|
||||||
|
printf( "sparse checksum %x\n", sparse_checksum );
|
||||||
|
if( (sparse_checksum != contiguous_checksum) &&
|
||||||
|
(pack_checksum != sparse_checksum) ) {
|
||||||
printf( "ERROR!!! the checksum algorithm does not work as expected\n" );
|
printf( "ERROR!!! the checksum algorithm does not work as expected\n" );
|
||||||
printf( "contiguous checksum %x != sparse checksum %x\n",
|
|
||||||
contiguous_checksum, sparse_checksum );
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
printf( "contiguous checksum %x == sparse checksum %x\n",
|
printf( "COOL the 3 checksum match\n" );
|
||||||
contiguous_checksum, sparse_checksum );
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Загрузка…
Ссылка в новой задаче
Block a user