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$
@ -20,7 +21,7 @@ Get a free account and login; you can then browse to the list of
available courses. Look for the ones with "MPI" in the title.
There are two MPI examples in this directory, each using one of six
different MPI interfaces:
different MPI interfaces:
- Hello world
C: hello_c.c
@ -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}