1
1
openmpi/test/asm/atomic_cmpset.c
Brian Barrett 0964152893 clean up the OMPI_BUILDING #define. Rather than being defined to 1 if
we are part of the source tree and not defined otherwise, we are going
with an always defined if ompi_config.h is included policy.  If
ompi_config.h is included before mpi.h or before OMPI_BUILDING is set,
it will set OMPI_BUILDING to 1 and enable all the internal code that
is in ompi_config_bottom.h.  Otherwise, it will only include the
system configuration data (enough for defining the C and C++ interfaces
to MPI, but not perturbing the user environment).

This should fix the problems with bool and the like that the Eclipse
folks were seeing.  It also cleans up some build system hacks that
we had along the way.

Also, don't use int64_t as the default size of MPI_Offset, because it
requires us including stdint.h in mpi.h, which is something we really
shouldn't be doing.

And finally, fix a ROMIO Makefile that didn't set -DOMPI_BUILDING=1,
as ROMIO includes mpi.h, but not ompi_config.h

This commit was SVN r5430.
2005-04-19 03:51:20 +00:00

289 строки
7.3 KiB
C

/*
* Copyright (c) 2004-2005 The Trustees of Indiana University.
* All rights reserved.
* Copyright (c) 2004-2005 The Trustees of the University of Tennessee.
* All rights reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#define OMPI_BUILDING 0
#include "ompi_config.h"
#undef NDEBUG
#define DEBUG
#include <assert.h>
#ifdef HAVE_PTHREAD_H
#include <pthread.h>
#endif
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "include/sys/atomic.h"
/* default options */
int nreps = 100;
int nthreads = 2;
int enable_verbose = 0;
volatile int32_t vol32;
int32_t val32;
int32_t old32;
int32_t new32;
#if OMPI_HAVE_ATOMIC_MATH_64
volatile int64_t vol64;
int64_t val64;
int64_t old64;
int64_t new64;
#endif
volatile int volint;
int valint;
int oldint;
int newint;
volatile void *volptr;
void *oldptr;
void *newptr;
#if OMPI_HAVE_POSIX_THREADS
static void *thread_main(void *arg)
{
int rank = (int) (unsigned long) arg;
int i;
/* thread tests */
for (i = 0; i < nreps; i++) {
ompi_atomic_add_32(&val32, 5);
#if OMPI_HAVE_ATOMIC_MATH_64
ompi_atomic_add_64(&val64, 5);
#endif
ompi_atomic_add(&valint, 5);
}
return (void *) (unsigned long) (rank + 1000);
}
#endif
int main(int argc, char *argv[])
{
#if OMPI_HAVE_POSIX_THREADS
int tid;
pthread_t *th;
#endif
if (argc != 2) {
printf("*** Incorrect number of arguments. Skipping test\n");
return 77;
}
nthreads = atoi(argv[1]);
/* first test single-threaded functionality */
/* -- cmpset 32-bit tests -- */
vol32 = 42, old32 = 42, new32 = 50;
assert(ompi_atomic_cmpset_32(&vol32, old32, new32) == 1);
ompi_atomic_rmb();
assert(vol32 == new32);
vol32 = 42, old32 = 420, new32 = 50;
assert(ompi_atomic_cmpset_32(&vol32, old32, new32) == 0);
ompi_atomic_rmb();
assert(vol32 == 42);
vol32 = 42, old32 = 42, new32 = 50;
assert(ompi_atomic_cmpset_acq_32(&vol32, old32, new32) == 1);
assert(vol32 == new32);
vol32 = 42, old32 = 420, new32 = 50;
assert(ompi_atomic_cmpset_acq_32(&vol32, old32, new32) == 0);
assert(vol32 == 42);
vol32 = 42, old32 = 42, new32 = 50;
assert(ompi_atomic_cmpset_rel_32(&vol32, old32, new32) == 1);
ompi_atomic_rmb();
assert(vol32 == new32);
vol32 = 42, old32 = 420, new32 = 50;
assert(ompi_atomic_cmpset_rel_32(&vol32, old32, new32) == 0);
ompi_atomic_rmb();
assert(vol32 == 42);
/* -- cmpset 64-bit tests -- */
#if OMPI_HAVE_ATOMIC_MATH_64
vol64 = 42, old64 = 42, new64 = 50;
assert(1 == ompi_atomic_cmpset_64(&vol64, old64, new64));
ompi_atomic_rmb();
assert(new64 == vol64);
vol64 = 42, old64 = 420, new64 = 50;
assert(ompi_atomic_cmpset_64(&vol64, old64, new64) == 0);
ompi_atomic_rmb();
assert(vol64 == 42);
vol64 = 42, old64 = 42, new64 = 50;
assert(ompi_atomic_cmpset_acq_64(&vol64, old64, new64) == 1);
assert(vol64 == new64);
vol64 = 42, old64 = 420, new64 = 50;
assert(ompi_atomic_cmpset_acq_64(&vol64, old64, new64) == 0);
assert(vol64 == 42);
vol64 = 42, old64 = 42, new64 = 50;
assert(ompi_atomic_cmpset_rel_64(&vol64, old64, new64) == 1);
ompi_atomic_rmb();
assert(vol64 == new64);
vol64 = 42, old64 = 420, new64 = 50;
assert(ompi_atomic_cmpset_rel_64(&vol64, old64, new64) == 0);
ompi_atomic_rmb();
assert(vol64 == 42);
#endif
/* -- cmpset int tests -- */
volint = 42, oldint = 42, newint = 50;
assert(ompi_atomic_cmpset(&volint, oldint, newint) == 1);
ompi_atomic_rmb();
assert(volint ==newint);
volint = 42, oldint = 420, newint = 50;
assert(ompi_atomic_cmpset(&volint, oldint, newint) == 0);
ompi_atomic_rmb();
assert(volint == 42);
volint = 42, oldint = 42, newint = 50;
assert(ompi_atomic_cmpset_acq(&volint, oldint, newint) == 1);
assert(volint == newint);
volint = 42, oldint = 420, newint = 50;
assert(ompi_atomic_cmpset_acq(&volint, oldint, newint) == 0);
assert(volint == 42);
volint = 42, oldint = 42, newint = 50;
assert(ompi_atomic_cmpset_rel(&volint, oldint, newint) == 1);
ompi_atomic_rmb();
assert(volint == newint);
volint = 42, oldint = 420, newint = 50;
assert(ompi_atomic_cmpset_rel(&volint, oldint, newint) == 0);
ompi_atomic_rmb();
assert(volint == 42);
/* -- cmpset ptr tests -- */
volptr = (void *) 42, oldptr = (void *) 42, newptr = (void *) 50;
assert(ompi_atomic_cmpset_ptr(&volptr, oldptr, newptr) == 1);
ompi_atomic_rmb();
assert(volptr == newptr);
volptr = (void *) 42, oldptr = (void *) 420, newptr = (void *) 50;
assert(ompi_atomic_cmpset_ptr(&volptr, oldptr, newptr) == 0);
ompi_atomic_rmb();
assert(volptr == (void *) 42);
volptr = (void *) 42, oldptr = (void *) 42, newptr = (void *) 50;
assert(ompi_atomic_cmpset_acq_ptr(&volptr, oldptr, newptr) == 1);
assert(volptr == newptr);
volptr = (void *) 42, oldptr = (void *) 420, newptr = (void *) 50;
assert(ompi_atomic_cmpset_acq_ptr(&volptr, oldptr, newptr) == 0);
assert(volptr == (void *) 42);
volptr = (void *) 42, oldptr = (void *) 42, newptr = (void *) 50;
assert(ompi_atomic_cmpset_rel_ptr(&volptr, oldptr, newptr) == 1);
ompi_atomic_rmb();
assert(volptr == newptr);
volptr = (void *) 42, oldptr = (void *) 420, newptr = (void *) 50;
assert(ompi_atomic_cmpset_rel_ptr(&volptr, oldptr, newptr) == 0);
ompi_atomic_rmb();
assert(volptr == (void *) 42);
/* -- add_32 tests -- */
val32 = 42;
assert(ompi_atomic_add_32(&val32, 5) == (42 + 5));
ompi_atomic_rmb();
assert((42 + 5) == val32);
/* -- add_64 tests -- */
#if OMPI_HAVE_ATOMIC_MATH_64
val64 = 42;
assert(ompi_atomic_add_64(&val64, 5) == (42 + 5));
ompi_atomic_rmb();
assert((42 + 5) == val64);
#endif
/* -- add_int tests -- */
valint = 42;
ompi_atomic_add(&valint, 5);
ompi_atomic_rmb();
assert((42 + 5) == valint);
/* threaded tests */
val32 = 0;
#if OMPI_HAVE_ATOMIC_MATH_64
val64 = 0ul;
#endif
valint = 0;
/* -- create the thread set -- */
#if OMPI_HAVE_POSIX_THREADS
th = (pthread_t *) malloc(nthreads * sizeof(pthread_t));
if (!th) {
perror("malloc");
exit(EXIT_FAILURE);
}
for (tid = 0; tid < nthreads; tid++) {
if (pthread_create(&th[tid], NULL, thread_main, (void *) (unsigned long) tid) != 0) {
perror("pthread_create");
exit(EXIT_FAILURE);
}
}
/* -- wait for the thread set to finish -- */
for (tid = 0; tid < nthreads; tid++) {
void *thread_return;
if (pthread_join(th[tid], &thread_return) != 0) {
perror("pthread_join");
exit(EXIT_FAILURE);
}
}
free(th);
ompi_atomic_rmb();
assert((5 * nthreads * nreps) == val32);
#if OMPI_HAVE_ATOMIC_MATH_64
ompi_atomic_rmb();
assert((5 * nthreads * nreps) == val64);
#endif
ompi_atomic_rmb();
assert((5 * nthreads * nreps) == valint);
#endif
return 0;
}