1
1

shmem-fortran fix, naming conventions for shmem option, examples

This commit was SVN r29518.
Этот коммит содержится в:
Mike Dubman 2013-10-25 05:25:41 +00:00
родитель a4ae1705dd
Коммит 5cc1f3803b
11 изменённых файлов: 294 добавлений и 149 удалений

Просмотреть файл

@ -39,28 +39,28 @@ AC_DEFINE_UNQUOTED([OSHMEM_SPEC_COMPAT], [$OSHMEM_SPEC_COMPAT],
#
# Do we want to disable OSHMEM parameter checking at run-time?
#
AC_MSG_CHECKING([if want SHMEM API parameter checking])
AC_ARG_WITH(shmem-param-check,
AC_HELP_STRING([--shmem-param-check(=VALUE)],
[behavior of SHMEM function parameter checking. Valid values are: always, never. If --with-shmem-param-check is specified with no VALUE argument, it is equivalent to a VALUE of "always"; --without-shmem-param-check is equivalent to "never" (default: always).]))
AC_MSG_CHECKING([if want OSHMEM API parameter checking])
AC_ARG_WITH(oshmem-param-check,
AC_HELP_STRING([--oshmem-param-check(=VALUE)],
[behavior of OSHMEM API function parameter checking. Valid values are: always, never. If --with-oshmem-param-check is specified with no VALUE argument, it is equivalent to a VALUE of "always"; --without-oshmem-param-check is equivalent to "never" (default: always).]))
shmem_param_check=1
if test "$with_shmem_param_check" = "no" -o \
"$with_shmem_param_check" = "never"; then
if test "$with_oshmem_param_check" = "no" -o \
"$with_oshmem_param_check" = "never"; then
shmem_param_check=0
AC_MSG_RESULT([never])
elif test "$with_shmem_param_check" = "yes" -o \
"$with_shmem_param_check" = "always" -o \
-z "$with_shmem_param_check"; then
elif test "$with_oshmem_param_check" = "yes" -o \
"$with_oshmem_param_check" = "always" -o \
-z "$with_oshmem_param_check"; then
shmem_param_check=1
AC_MSG_RESULT([always])
else
AC_MSG_RESULT([unknown])
AC_MSG_WARN([*** Unrecognized --with-shmem-param-check value])
AC_MSG_WARN([*** Unrecognized --with-oshmem-param-check value])
AC_MSG_WARN([*** See "configure --help" output])
AC_MSG_WARN([*** Defaulting to "runtime"])
fi
AC_DEFINE_UNQUOTED(OSHMEM_PARAM_CHECK, $shmem_param_check,
[Whether we want to check SHMEM parameters always or never])
[Whether we want to check OSHMEM parameters always or never])
#
@ -85,15 +85,18 @@ AM_CONDITIONAL(OSHMEM_PROFILING, test "$oshmem_profiling_support" = 1)
AC_ARG_ENABLE(oshmem-fortran,
AC_HELP_STRING([--enable-oshmem-fortran],
[enable OSHMEM Fortran bindings (default: enabled if Fortran compiler found)]))
if test "$enable_oshmem_fortran" != "no"; then
AS_IF([test $OMPI_WANT_FORTRAN_BINDINGS -eq 1],
[if test "$enable_oshmem_fortran" != "no"; then
AC_MSG_RESULT([yes])
OSHMEM_WANT_FORTRAN_BINDINGS=1
else
AC_MSG_RESULT([no])
OSHMEM_WANT_FORTRAN_BINDINGS=0
fi
fi],
[AC_MSG_RESULT([no])
OSHMEM_WANT_FORTRAN_BINDINGS=0])
AC_MSG_CHECKING([if want to build SHMEM fortran bindings])
AC_MSG_CHECKING([if want to build OSHMEM fortran bindings])
AM_CONDITIONAL(OSHMEM_WANT_FORTRAN_BINDINGS,
[test $OSHMEM_WANT_FORTRAN_BINDINGS -eq 1])
AS_IF([test $OSHMEM_WANT_FORTRAN_BINDINGS -eq 1],

Просмотреть файл

@ -12,6 +12,7 @@
# Copyright (c) 2006-2007 Sun Microsystems, Inc. All rights reserved.
# Copyright (c) 2011-2012 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2012 Los Alamos National Security, Inc. All rights reserved.
# Copyright (c) 2013 Mellanox Technologies, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -28,7 +29,9 @@ CXX = mpic++
CCC = mpic++
FC = mpifort
JAVAC = mpijavac
SHMEM = shmemcc
SHMEMCC = shmemcc
SHMEMFC = shmemfort
# Using -g is not necessary, but it is helpful for example programs,
# especially if users want to examine them with debuggers. Note that
# gmake requires the CXXFLAGS macro, while other versions of make
@ -48,12 +51,16 @@ EXAMPLES = \
hello_usempi \
hello_usempif08 \
hello_shmem \
hello_shmemfh \
Hello.class \
ring_c \
ring_cxx \
ring_mpifh \
ring_usempi \
ring_usempif08 \
ring_shmem \
ring_shmemfh \
ring_shmemf90 \
Ring.class \
connectivity_c
@ -78,6 +85,10 @@ all: hello_c ring_c connectivity_c
fi
@ if ompi_info --parsable | grep mca:shmem >/dev/null; then \
$(MAKE) hello_shmem; \
$(MAKE) hello_shmemfh; \
$(MAKE) ring_shmem; \
$(MAKE) ring_shmemfh; \
$(MAKE) ring_shmemf90; \
fi
# The usual "clean" target
@ -107,7 +118,15 @@ Hello.class: Hello.java
Ring.class: Ring.java
$(JAVAC) Ring.java
hello_shmem: hello_shmem.c
$(SHMEM) $(CFLAGS) $^ -o $@
hello_shmem: hello_shmem_c.c
$(SHMEMCC) $(CFLAGS) $^ -o $@
hello_shmemfh: hello_shmemfh.f
$(SHMEMFC) $(FCFLAGS) $^ -o $@
ring_shmem: ring_shmem_c.c
$(SHMEMCC) $(CFLAGS) $^ -o $@
ring_shmemfh: ring_shmemfh.f
$(SHMEMFC) $(FCFLAGS) $^ -o $@
ring_shmemf90: ring_shmem.f90
$(SHMEMFC) $(FCFLAGS) $^ -o $@

Просмотреть файл

@ -13,6 +13,7 @@
# Copyright (c) 2006-2012 Cisco Systems, Inc. All rights reserved.
# Copyright (c) 2007 Sun Microsystems, Inc. All rights reserved.
# Copyright (c) 2012 Los Alamos National Security, Inc. All rights reserved.
# Copyright (c) 2013 Mellanox Technologies, Inc. All rights reserved.
# $COPYRIGHT$
#
# Additional copyrights may follow
@ -37,11 +38,16 @@ EXTRA_DIST += \
examples/hello_mpifh.f \
examples/hello_usempi.f90 \
examples/hello_usempif08.f90 \
examples/hello_shmem_c.c \
examples/hello_shmemfh.f \
examples/ring_c.c \
examples/ring_cxx.cc \
examples/ring_mpifh.f \
examples/ring_usempi.f90 \
examples/ring_usempif08.f90 \
examples/ring_shmem_c.c \
examples/ring_shmemfh.f \
examples/ring_shmem.f90 \
examples/connectivity_c.c \
examples/Hello.java \
examples/Ring.java

Просмотреть файл

@ -4,6 +4,7 @@ Copyright (c) 2004-2006 The Trustees of Indiana University and Indiana
Copyright (c) 2006-2012 Cisco Systems, Inc. All rights reserved.
Copyright (c) 2007-2009 Sun Microsystems, Inc. All rights reserved.
Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved.
Copyright (c) 2013 Mellanox Technologies, Inc. All rights reserved.
$COPYRIGHT$
@ -29,7 +30,8 @@ different MPI interfaces:
Fortran use mpi: hello_usempi.f90
Fortran use mpi_f08: hello_usempif08.f90
Java: Hello.java
OSHMEM: hello_shmem.c
C shmem.h: hello_shmem_c.c
Fortran shmemfh.f: hello_shmemfh.f
- Send a trivial message around in a ring
C: ring_c.c
@ -38,6 +40,9 @@ different MPI interfaces:
Fortran use mpi: ring_usempi.f90
Fortran use mpi_f08: ring_usempif08.f90
Java: Ring.java
C shmem.h: ring_shmem_c.c
Fortran shmemfh.f: ring_shmemfh.f
F90 shmemfh.f: ring_shmem.f90
Additionally, there's one further example application, but this one
only uses the MPI C bindings:

Просмотреть файл

@ -1,128 +0,0 @@
#include "shmem.h"
#include "stdio.h"
#define N 100
static int target[N];
static int source[N];
#define STATIC_CHECK 1
#define DYNAMIC_CHECK 1
#define ATOMIC 1
#define PEER 1
int main()
{
int *source_d,*target_d;
int i;
start_pes(0);
source_d = shmalloc(sizeof(*source_d)*N);
target_d = shmalloc(sizeof(*target_d)*N);
for (i = 0; i < N; i++)
{
source_d[i] = source[i] = 1;
target[i] = target_d[i] = 9;
}
int peer = PEER;
if (_my_pe() == 0)
{
#if STATIC_CHECK
int c, f;
int a = c, b = f;
#if ATOMIC
for (i = 0; i < N; i++)
target[i] = shmem_int_g(source + i, peer);
#else
shmem_int_get(target, source, N, PEER);
#endif
#endif
#if DYNAMIC_CHECK
#if ATOMIC
for (i = 0; i < N; i++)
{
target_d[i] = shmem_int_g(source_d + i, peer);
}
#else
shmem_int_get(target_d, source_d, N, PEER);
#endif
#endif
}
if(_my_pe() == 0)
{
for (i = 0; i < N; i++)
{
#if DYNAMIC_CHECK
if(target_d[i] != 1)
{
printf("Get dynamic error %d, target + i = %p, target[0] = %d, target[1] = %d\n",i, target_d + i,target_d[0], target_d[1]);
fflush(stdout);
return 1;
#endif
#if STATIC_CHECK
if (target[i] != 1)
{
printf("Get static error %d, target + i = %p, target[i] = %d\n",i, target + i,target[i]);
fflush(stdout);
return 1;
}
#endif
}
}
}
/*put check*/
for (i = 0; i < N; i++)
{
source_d[i] = source[i] = 1;
target[i] = target_d[i] = -9;
}
shmem_barrier_all();
if (_my_pe() == 0)
{
#if STATIC_CHECK
shmem_int_put(target, source, N, PEER);
#endif
#if DYNAMIC_CHECK
shmem_int_put(target_d, source_d, N, PEER);
#endif
}
shmem_barrier_all();
if(_my_pe() == PEER)
{
for (i = 0; i < N; i++)
{
#if DYNAMIC_CHECK
if(target_d[i] != 1)
{
printf("Put dynamic error\n");
fflush(stdout);
return 1;
}
#endif
#if STATIC_CHECK
if (target[i] != 1)
{
printf("Put static error\n");
fflush(stdout);
return 1;
}
#endif
}
}
printf("All test passed\n");fflush(stdout);
shmem_finalize();
return 0;
}

26
examples/hello_shmem_c.c Обычный файл
Просмотреть файл

@ -0,0 +1,26 @@
/*
* Copyright (c) 2013 Mellanox Technologies, Inc.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include <stdio.h>
#include "shmem.h"
int main(int argc, char* argv[])
{
int proc, nproc;
start_pes(0);
nproc = _num_pes();
proc = _my_pe();
printf("Hello, world, I am %d of %d\n",
proc, nproc);
return 0;
}

19
examples/hello_shmemfh.f Обычный файл
Просмотреть файл

@ -0,0 +1,19 @@
C *
C * Copyright (c) 2013 Mellanox Technologies, Inc.
C * All rights reserved.
C * $COPYRIGHT$
C *
C * Additional copyrights may follow
C *
C * $HEADER$
C *
program main
integer proc, nproc
call START_PES(0)
proc = MY_PE()
nproc = NUM_PES()
write(*, '("Hello, world, I am ", i2, " of ", i2)')
& proc, nproc
end

64
examples/ring_shmem.f90 Обычный файл
Просмотреть файл

@ -0,0 +1,64 @@
!
! Copyright (c) 2013 Mellanox Technologies, Inc.
! All rights reserved.
! $COPYRIGHT$
!
! Additional copyrights may follow
!
! $HEADER$
!
program ring_shmem_f90
implicit none
include 'shmem.fh'
integer*8, save :: rbuf
integer*8 :: message
integer :: proc, nproc, next
! func definitions
integer :: my_pe, num_pes
rbuf = -1
message = 10
call start_pes(0)
proc = my_pe()
nproc = num_pes()
! Calculate the PE number of the next process in the ring. Use the
! modulus operator so that the last process "wraps around" to PE 0.
next = mod((proc + 1), nproc)
if (proc == 0) then
write(*, '("Process 0 sending ", i2, " to", i2, " (", i2, " processes in ring)")') message, next, nproc
call shmem_put8(rbuf, message, 1, next)
write(*, '("Process 0 sent to ", i2)') next
end if
! Pass the message around the ring. The exit mechanism works as
! follows: the message (a positive integer) is passed around the
! ring. Each time it passes PE 0, it is decremented. When each
! processes receives a message containing a 0 value, it passes the
! message on to the next process and then quits. By passing the 0
! message first, every process gets the 0 message and can quit
! normally.
do while(message > 0)
call shmem_int8_wait_until(rbuf, SHMEM_CMP_EQ, message)
if (proc == 0) then
message = message - 1
write(*, '("Process 0 decremented value:", i2)') message
else
message = rbuf
end if
call shmem_put8(rbuf, message, 1, next)
end do
! All done
write(*, '("Process", i2," exiting.")') proc
end program

60
examples/ring_shmem_c.c Обычный файл
Просмотреть файл

@ -0,0 +1,60 @@
/*
* Copyright (c) 2013 Mellanox Technologies, Inc.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include <shmem.h>
#include <stdio.h>
int main (int argc, char * argv[])
{
static int rbuf = -1;
int proc, nproc, next, prev;
int message = 10;
start_pes(0);
proc = _my_pe();
nproc = _num_pes();
/* Calculate the PE number of the next process in the ring. Use the
modulus operator so that the last process "wraps around" to PE 0. */
next = (proc + 1) % nproc;
if(proc == 0)
{
printf("Process 0 puts message %d to %d (%d processes in ring)\n", message, next, nproc);
shmem_int_put(&rbuf, &message, 1, next);
}
/* Pass the message around the ring. The exit mechanism works as
follows: the message (a positive integer) is passed around the
ring. Each time it passes PE 0, it is decremented. When each
processes receives a message containing a 0 value, it passes the
message on to the next process and then quits. By passing the 0
message first, every process gets the 0 message and can quit
normally. */
while(message > 0) {
shmem_int_wait_until(&rbuf, SHMEM_CMP_EQ, message);
if(proc == 0) {
--message;
printf("Process 0 decremented value: %d\n", message);
}
else {
message = rbuf;
}
shmem_int_put(&rbuf, &message, 1, next);
}
/* All done */
printf("Process %d exiting\n", proc);
return 0;
}

71
examples/ring_shmemfh.f Обычный файл
Просмотреть файл

@ -0,0 +1,71 @@
C
C Copyright (c) 2013 Mellanox Technologies, Inc.
C All rights reserved.
C $COPYRIGHT$
C
C Additional copyrights may follow
C
C $HEADER$
C
program ring_shmem_f77
implicit none
include 'shmem.fh'
integer*8 rbuf
save rbuf
integer*8 message
integer proc, nproc, next
C func definitions
integer my_pe, num_pes
rbuf = -1
message = 10
call start_pes(0)
proc = my_pe()
nproc = num_pes()
C Calculate the PE number of the next process in the ring. Use the
C modulus operator so that the last process "wraps around" to PE 0.
next = mod((proc + 1), nproc)
if (proc .eq. 0) then
write(*, '("Process 0 sending ", i2, " to ", i2,
& " (", i2, " processes in ring)")')
& message, next, nproc
call shmem_put8(rbuf, message, 1, next)
write(*, '("Process 0 sent to ", i2)') next
end if
C Pass the message around the ring. The exit mechanism works as
C follows: the message (a positive integer) is passed around the
C ring. Each time it passes PE 0, it is decremented. When each
C processes receives a message containing a 0 value, it passes the
C message on to the next process and then quits. By passing the 0
C message first, every process gets the 0 message and can quit
C normally.
10 call shmem_int8_wait_until(rbuf, SHMEM_CMP_EQ, message)
if (proc .eq. 0) then
message = message - 1
write(*, '("Process 0 decremented value:", i2)') message
else
message = rbuf
end if
call shmem_put8(rbuf, message, 1, next)
if (message .gt. 0) then
goto 10
else
goto 20
end if
C All done
20 write(*, '("Process", i2," exiting.")') proc
end

Просмотреть файл

@ -31,8 +31,8 @@ linker_flags=@OMPI_WRAPPER_EXTRA_LDFLAGS@
# the MPI API.
libs=-lshmem -lmpi @OMPI_WRAPPER_EXTRA_LIBS@
libs_static=-lshmem -lmpi -lopen-rte -lopen-pal @OMPI_WRAPPER_EXTRA_LIBS@
dyn_lib_file=libmpi.@OPAL_DYN_LIB_SUFFIX@
static_lib_file=libmpi.a
dyn_lib_file=libshmem.@OPAL_DYN_LIB_SUFFIX@
static_lib_file=libshmem.a
required_file=
includedir=${includedir}
libdir=${libdir}