Skip to content

Commit

Permalink
add fortran interface for mount and unmount
Browse files Browse the repository at this point in the history
Also adds configure support for fortran, and a writeread example
written in fortran.

Note: checkpatch doesn't understand Fortran code
TEST_CHECKPATCH_SKIP_FILES="client/src/unifycrf.h"
TEST_CHECKPATCH_SKIP_FILES+=",client/src/unifycrf.h"
TEST_CHECKPATCH_SKIP_FILES+=",examples/src/writeread.f90"
  • Loading branch information
adammoody authored and MichaelBrim committed Apr 5, 2019
1 parent 24c254e commit 27a0272
Show file tree
Hide file tree
Showing 8 changed files with 265 additions and 4 deletions.
1 change: 1 addition & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ before_install:
- test -n $CC && unset CC
- sudo apt-get -qq update
- sudo apt-get install --yes -qq build-essential autoconf libtool cmake
- sudo apt-get install --yes -qq gfortran
- sudo apt-get install --yes -qq libopenmpi-dev openmpi-bin
- sudo apt-get install --yes -qq libhdf5-openmpi-dev
- (cd $HOME/spack; git describe) || git clone https://github.com/spack/spack $HOME/spack
Expand Down
8 changes: 6 additions & 2 deletions client/src/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
lib_LTLIBRARIES = libunifycr.la libunifycr_gotcha.la
lib_LTLIBRARIES = libunifycr.la libunifycr_gotcha.la libunifycrf.la

libunifycrdir = $(includedir)
libunifycr_gotchadir = $(includedir)

AM_CFLAGS = -Wall -Wno-strict-aliasing

include_HEADERS = unifycr.h
include_HEADERS = unifycr.h unifycrf.h

CLIENT_COMMON_CPPFLAGS = \
-I$(top_builddir)/client \
Expand Down Expand Up @@ -68,3 +68,7 @@ libunifycr_gotcha_la_CFLAGS = $(CLIENT_COMMON_CFLAGS) $(GOTCHA_CFLAGS)
libunifycr_gotcha_la_LDFLAGS = $(CLIENT_COMMON_LDFLAGS) $(GOTCHA_LDFLAGS)
libunifycr_gotcha_la_LIBADD = $(CLIENT_COMMON_LIBADD) -lgotcha

libunifycrf_la_SOURCES = unifycrf.c
libunifycrf_la_CPPFLAGS = $(CLIENT_COMMON_CPPFLAGS)
libunifycrf_la_CFLAGS = $(AM_CFLAGS) $(CLIENT_COMMON_CFLAGS)
libunifycrf_la_LIBADD = libunifycr_gotcha.la
162 changes: 162 additions & 0 deletions client/src/unifycrf.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,162 @@
/*
* Copyright (c) 2017, Lawrence Livermore National Security, LLC.
* Produced at the Lawrence Livermore National Laboratory.
*
* Copyright 2017-2019, UT-Battelle, LLC.
*
* LLNL-CODE-741539
* All rights reserved.
*
* This is the license for UnifyCR.
* For details, see https://github.com/LLNL/UnifyCR.
* Please read https://github.com/LLNL/UnifyCR/LICENSE for full license text.
*/

/* This file compiles a normalized interface for Fortran in which:
* - Fortran link names are in lower case
* - Fortran link names have a single trailing underscore
* - boolean true is expected to be 1
*/

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "unifycr.h"

/* TODO: enable UNIFYCR_Fint to be configured to be different type */
typedef int UNIFYCR_Fint;

#ifdef USE_FORT_STDCALL
# define FORT_CALL __stdcall
#elif defined (USE_FORT_CDECL)
# define FORT_CALL __cdecl
#else
# define FORT_CALL
#endif

#ifdef USE_FORT_MIXED_STR_LEN
# define FORT_MIXED_LEN_DECL , UNIFYCR_Fint
# define FORT_END_LEN_DECL
# define FORT_MIXED_LEN(a) , UNIFYCR_Fint a
# define FORT_END_LEN(a)
#else
# define FORT_MIXED_LEN_DECL
# define FORT_END_LEN_DECL , UNIFYCR_Fint
# define FORT_MIXED_LEN(a)
# define FORT_END_LEN(a) , UNIFYCR_Fint a
#endif

#ifdef HAVE_FORTRAN_API
# ifdef FORTRAN_EXPORTS
# define FORTRAN_API __declspec(dllexport)
# else
# define FORTRAN_API __declspec(dllimport)
# endif
#else
# define FORTRAN_API
#endif

/* convert a Fortran string to a C string, by removing any trailing
* spaces and terminating with a NULL */
static int unifycr_fstr2cstr(const char* fstr, int flen, char* cstr, int clen)
{
int rc = 0;

/* check that our pointers aren't NULL */
if ((fstr == NULL) || (cstr == NULL)) {
return 1;
}

/* determine length of Fortran string after removing trailing spaces */
while ((flen > 0) && (fstr[flen-1] == ' ')) {
flen--;
}

/* assume we can copy the whole string */
int len = flen;
if (flen > (clen - 1)) {
/* Fortran string is longer than C buffer, trucnated copy */
len = clen - 1;
rc = 1;
}

/* copy the Fortran string to the C string */
if (len > 0) {
strncpy(cstr, fstr, len);
}

/* null-terminate the C string */
if (len >= 0) {
cstr[len] = '\0';
}

return rc;
}

/* convert a C string to a Fortran string, adding trailing spaces
* as necessary */
static int unifycr_cstr2fstr(const char* cstr, char* fstr, int flen)
{
int rc = 0;

/* check that our pointers aren't NULL */
if ((cstr == NULL) || (fstr == NULL)) {
return 1;
}

/* determine length of C string */
int clen = strlen(cstr);

/* copy the characters from the Fortran string to the C string */
if (clen <= flen) {
/* C string will fit within our Fortran buffer, copy it over */
if (clen > 0) {
strncpy(fstr, cstr, clen);
}

/* fill in trailing spaces */
while (clen < flen) {
fstr[clen] = ' ';
clen++;
}
} else {
/* C string is longer than Fortran buffer, truncated copy */
strncpy(fstr, cstr, flen);
rc = 1;
}

return rc;
}

/*================================================
* Mount, Unmount
*================================================*/

FORTRAN_API
void FORT_CALL unifycr_mount_(char* prefix FORT_MIXED_LEN(prefix_len),
int* rank, int* size, int* app_id,
int* ierror FORT_END_LEN(prefix_len))
{
/* convert name from a Fortran string to C string */
char prefix_tmp[1024];
int rc = unifycr_fstr2cstr(prefix, prefix_len,
prefix_tmp, sizeof(prefix_tmp));
if (rc != 0) {
*ierror = 1; // !UNIFYCR_SUCCESS
return;
}

int rank_tmp = *rank;
int size_tmp = *size;
int app_id_tmp = *app_id;
*ierror = unifycr_mount(prefix_tmp, rank_tmp, size_tmp, app_id_tmp);
return;
}

FORTRAN_API
void FORT_CALL unifycr_unmount_(int* ierror)
{
*ierror = unifycr_unmount();
return;
}
15 changes: 15 additions & 0 deletions client/src/unifycrf.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
! Copyright (c) 2017, Lawrence Livermore National Security, LLC.
! Produced at the Lawrence Livermore National Laboratory.
!
! Copyright 2017-2019, UT-Battelle, LLC.
!
! LLNL-CODE-741539
! All rights reserved.
!
! This is the license for UnifyCR.
! For details, see https://github.com/LLNL/UnifyCR.
! Please read https://github.com/LLNL/UnifyCR/LICENSE for full license text.
!
! return codes
INTEGER UNIFYCR_SUCCESS
PARAMETER (UNIFYCR_SUCCESS=0)
2 changes: 2 additions & 0 deletions common/src/Makefile.am
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
lib_LTLIBRARIES = libunifycr_common.la

include_HEADERS = unifycr_const.h err_enumerator.h

libunifycr_commondir = $(includedir)

BASE_SRCS = \
Expand Down
8 changes: 8 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ AC_PROG_MAKE_SET
AC_PROG_RANLIB
AC_PROG_LIBTOOL

# fortran support
AC_PROG_FC
AC_FC_LIBRARY_LDFLAGS
AC_FC_DUMMY_MAIN

# Checks for typedefs, structures, and compiler characteristics.
AC_TYPE_MODE_T
AC_TYPE_OFF_T
Expand Down Expand Up @@ -152,6 +157,9 @@ AC_CHECK_HEADERS(mntent.h sys/mount.h)

# look for MPI and set flags
LX_FIND_MPI
AC_LANG_PUSH([Fortran])
LX_FIND_MPI
AC_LANG_POP

# look for leveldb library, sets LEVELDB_CFLAGS/LDFLAGS/LIBS
UNIFYCR_AC_LEVELDB
Expand Down
16 changes: 14 additions & 2 deletions examples/src/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ libexec_PROGRAMS = \
cr-posix cr-gotcha cr-static \
read-posix read-gotcha read-static \
write-posix write-gotcha write-static \
writeread-posix writeread-gotcha writeread-static \
writeread-posix writeread-gotcha writeread-static writeread-ftn \
sysio-write-gotcha sysio-write-static \
sysio-read-gotcha sysio-read-static \
sysio-writeread-gotcha sysio-writeread-static sysio-writeread-posix \
Expand Down Expand Up @@ -32,8 +32,15 @@ noinst_HEADERS = \
test_cppflags = $(AM_CPPFLAGS) $(MPI_CFLAGS) \
-I$(top_srcdir)/client/src -I$(top_srcdir)/common/src

test_ftn_flags = $(AM_FCFLAGS) $(MPI_FFLAGS) \
-I$(top_srcdir)/client/src -I$(top_srcdir)/common/src
test_ftn_ldadd = $(top_builddir)/client/src/libunifycrf.la -lrt -lm $(FCLIBS)
test_ftn_ldflags = $(AM_LDFLAGS) $(MPI_FLDFLAGS) \
$(FLATCC_LDFLAGS) $(FLATCC_LIBS)

test_gotcha_ldadd = $(top_builddir)/client/src/libunifycr_gotcha.la -lrt -lm
test_gotcha_ldflags = $(AM_LDFLAGS) $(MPI_CLDFLAGS) $(FLATCC_LDFLAGS) $(FLATCC_LIBS)
test_gotcha_ldflags = $(AM_LDFLAGS) $(MPI_CLDFLAGS) \
$(FLATCC_LDFLAGS) $(FLATCC_LIBS)

test_posix_cppflags = $(AM_CPPFLAGS) $(MPI_CFLAGS) -DDISABLE_UNIFYCR
test_posix_ldadd = -lrt -lm
Expand Down Expand Up @@ -180,6 +187,11 @@ writeread_static_CPPFLAGS = $(test_cppflags)
writeread_static_LDADD = $(test_static_ldadd)
writeread_static_LDFLAGS = $(test_static_ldflags)

writeread_ftn_SOURCES = writeread.f90
writeread_ftn_FCFLAGS = $(test_ftn_flags)
writeread_ftn_LDADD = $(test_ftn_ldadd)
writeread_ftn_LDFLAGS = $(test_ftn_ldflags)

app_mpiio_gotcha_SOURCES = app-mpiio.c
app_mpiio_gotcha_CPPFLAGS = $(test_cppflags)
app_mpiio_gotcha_LDADD = $(test_gotcha_ldadd)
Expand Down
57 changes: 57 additions & 0 deletions examples/src/writeread.f90
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
program write_read_F

implicit none

include 'mpif.h'
include 'unifycrf.h'

character*1024 :: basefname = "file"
character*1024 :: fname, file_suffix
character*1024 :: prefix = "/unifycr"
integer(kind=4) :: flag;
integer(kind=4) :: outflags;
integer(kind=4) :: valid;

integer, parameter :: ni=20, nj=30, nk=45
integer :: loop_count=5

integer(kind=8), dimension(ni,nj,nk) :: W1, R1

integer :: ierr, errors, all_errors, nprocs, mynod, ios
integer :: i,j,k,loop

integer :: writeunit, readunit
integer(kind=8) :: nodeoff

! integer (kind = 8) :: total_bytes_transferred
real (kind = 8) :: total_bytes_transferred
real (kind = 4) overall_transfer_rate
real (kind = 8) time0, time1, iter_time0, iter_time1

call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, mynod, ierr)

call UNIFYCR_MOUNT(prefix, mynod, nprocs, 0, ierr)

nodeoff=2**21

fname = trim(prefix) // "/" // trim(basefname) // ".ckpt"

forall(i=1:ni,j=1:nj,k=1:nk) &
W1(i,j,k) = nodeoff*mynod+i+ni*(j-1+nj*(k-1))

open(unit=writeunit,file=fname,form='unformatted',action='write')

write(writeunit,iostat=ios) W1
close(writeunit)

! R1 = 0
! open(unit=readunit,file=fname,form='unformatted',action='read')
! read(readunit,iostat=ios) R1
! close(readunit)

call UNIFYCR_UNMOUNT(ierr)
call MPI_FINALIZE(ierr)

end program write_read_F

0 comments on commit 27a0272

Please sign in to comment.