Commit 3ac29abe authored by Thomas Macht's avatar Thomas Macht
Browse files

Distributed memory backend:

 - Added is-distributed property to type.
 - stdlib can be compiled for distributed memory backend.
 - Printing does not yet work correctly but other array accesses do.
 - For now, only AKS arrays can be distributed.
parent f6637368
Showing with 414 additions and 104 deletions
+414 -104
*.o
*.d
*~
*.sacbugreport
bin/*
lib/*
src/bin/*
......@@ -55,10 +56,10 @@ src/libsac2c/types/types_nodetype.h
src/libsac2c/types/types_trav.h
src/libsacphm/.last_style
src/libsacprelude/.last_style
src/libsacprelude/devel/libsacpreludeMod.*
src/libsacprelude/devel/libsacpreludeTree.*
src/libsacprelude/prod/libsacpreludeMod.*
src/libsacprelude/prod/libsacpreludeTree.*
src/libsacprelude/devel/libsacpreludeMod*.*
src/libsacprelude/devel/libsacpreludeTree*.*
src/libsacprelude/prod/libsacpreludeMod*.*
src/libsacprelude/prod/libsacpreludeTree*.*
src/makefiles/config.mkf
src/maketools/.last_style
src/runtime/.last_style
......
......@@ -2,3 +2,4 @@
/config.GASNetconduits
/sac2crc.GASNetconduits
/build.GASNetconduits
/build.GASNetconduitsCrossVariant
......@@ -96,6 +96,24 @@ EOF
@\$(CLOCK_SKEW_ELIMINATION)
EOF
dnl Append the rules for the libsacdistmem GASNet cross variant object files to build.mkf
dnl At the places where we print \$$** or \$$*@ we want $* $@ to end up in the makefile.
dnl However, $* is replaced by an empty string and $@ by \, escaping does not help.
cat <<EOF >>./build.GASNetconduitsCrossVariant
%.\$(\$(STYLE)_short)\$(CROSS_VARIANT).gasnet${gasnet_conduit_name}.o: %.c
@if [[ "compile \$(dir \$$**)" != "\`cat .make_track\`" ]] ; \\
then \$(ECHO) "compile \$(dir \$$**)" > .make_track; \\
\$(ECHO) ""; \\
\$(ECHO) "Compiling files in directory \$(PREFIX_LOCAL)\$(dir \$@)"; \\
fi
@\$(ECHO) " Compiling GasNET ${gasnet_conduit_name} \$(\$(STYLE)_long) code: \$(notdir \$<)"
\$(HIDE) \$(GASNET_${gasnet_conduit_name_uc}_CC) \\
\$(GASNET_${gasnet_conduit_name_uc}_CPPFLAGS) \$(GASNET_${gasnet_conduit_name_uc}_CFLAGS) \$(CC_FLAGS_\$(\$(STYLE)_cap)) \$(SETTINGS_\$(\$(STYLE)_cap)) \\
\$(CC_FLAGS_YY) \$(SETTINGS_DISTMEM) \$(SETTINGS_DISTMEM_GASNET) \\
\$(INCDIRS) -o \$$*@ -c \$<
@\$(CLOCK_SKEW_ELIMINATION)
EOF
done
if test x"$gasnet_conduit_names" = x ; then
......
......@@ -749,7 +749,8 @@ RCALPHA
RCMAC
GASNET_CONDUIT_TARGETS
GASNET_CONDUIT_SETTINGS
GASNET_CONDUIT_BUILD_OBJECT_FILES'
GASNET_CONDUIT_BUILD_OBJECT_FILES
GASNET_CONDUIT_BUILD_OBJECT_FILES_CROSS_VARIANT'
ac_user_opts='
enable_option_checking
enable_cplusplus
......@@ -5086,6 +5087,21 @@ EOF
@\$(CLOCK_SKEW_ELIMINATION)
EOF
cat <<EOF >>./build.GASNetconduitsCrossVariant
%.\$(\$(STYLE)_short)\$(CROSS_VARIANT).gasnet${gasnet_conduit_name}.o: %.c
@if [ "compile \$(dir \$*)" != "\`cat .make_track\`" ] ; \\
then \$(ECHO) "compile \$(dir \$*)" > .make_track; \\
\$(ECHO) ""; \\
\$(ECHO) "Compiling files in directory \$(PREFIX_LOCAL)\$(dir \)"; \\
fi
@\$(ECHO) " Compiling GasNET ${gasnet_conduit_name} \$(\$(STYLE)_long) code: \$(notdir \$<)"
\$(HIDE) \$(GASNET_${gasnet_conduit_name_uc}_CC) \\
\$(GASNET_${gasnet_conduit_name_uc}_CPPFLAGS) \$(GASNET_${gasnet_conduit_name_uc}_CFLAGS) \$(CC_FLAGS_\$(\$(STYLE)_cap)) \$(SETTINGS_\$(\$(STYLE)_cap)) \\
\$(CC_FLAGS_YY) \$(SETTINGS_DISTMEM) \$(SETTINGS_DISTMEM_GASNET) \\
\$(INCDIRS) -o \$@ -c \$<
@\$(CLOCK_SKEW_ELIMINATION)
EOF
done
if test x"$gasnet_conduit_names" = x ; then
......@@ -6454,6 +6470,9 @@ GASNET_CONDUIT_SETTINGS=./config.GASNetconduits
GASNET_CONDUIT_BUILD_OBJECT_FILES=./build.GASNetconduits
GASNET_CONDUIT_BUILD_OBJECT_FILES_CROSS_VARIANT=./build.GASNetconduitsCrossVariant
# generate specific flags for known os
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking sac2crc system flags" >&5
$as_echo_n "checking sac2crc system flags... " >&6; }
......
......@@ -288,6 +288,12 @@ dnl
AC_SUBST_FILE([GASNET_CONDUIT_BUILD_OBJECT_FILES])
GASNET_CONDUIT_BUILD_OBJECT_FILES=./build.GASNetconduits
dnl
dnl Append rules for building libsacdistmem GASNet cross variant object files to build.mkf
dnl
AC_SUBST_FILE([GASNET_CONDUIT_BUILD_OBJECT_FILES_CROSS_VARIANT])
GASNET_CONDUIT_BUILD_OBJECT_FILES_CROSS_VARIANT=./build.GASNetconduitsCrossVariant
# generate specific flags for known os
AC_MSG_CHECKING([sac2crc system flags])
......
......@@ -482,6 +482,7 @@ LDFLAGS += " @OPENMP_CFLAGS@"
*/
target distmem:
BACKEND := "DistMem"
LIB_VARIANT := "dm"
target distmem_gasnet::distmem:
DISTMEM_COMMLIB := "GASNet"
......
......@@ -61,7 +61,11 @@ SAC_RuntimeError (char *format, ...)
* heapmgr/setup.c or in libsac/nophm.c.
*/
fprintf (stderr, "\n\n*** SAC runtime error\n");
if (SAC_DISTMEM_rank == SAC_DISTMEM_RANK_UNDEFINED) {
fprintf (stderr, "\n\n*** SAC runtime error\n");
} else {
fprintf (stderr, "\n\n*** SAC runtime error at node %zd\n", SAC_DISTMEM_rank);
}
va_start (arg_p, format);
......
......@@ -97,7 +97,17 @@ SAC_TR_Print (char *format, ...)
{
va_list arg_p;
fprintf (stderr, "TR-> ");
#if 0
if (SAC_DISTMEM_rank != 0) {
return;
}
#endif
if (SAC_DISTMEM_rank == SAC_DISTMEM_RANK_UNDEFINED) {
fprintf (stderr, "TR-> ");
} else {
fprintf (stderr, "TR:n%zd-> ", SAC_DISTMEM_rank);
}
va_start (arg_p, format);
vfprintf (stderr, format, arg_p);
......
......@@ -99,6 +99,13 @@ ICMCompileDISTMEM_DECL__MIRROR (char *var_NT, int sdim, int *shp)
indout ("const bool SAC_DISTMEM_MIRROR_IS_DIST( %s) = "
"SAC_DISTMEM_DET_DO_DISTR_ARR( %d, %d);\n",
var_NT, size, shp[0]);
/*
* Initialize these variables to 0 to avoid warnings.
* If the array is distributed, they will be set to the correct values
* when the array is allocated. *
*/
indout ("size_t SAC_DISTMEM_MIRROR_FIRST_ELEMS( %s) = 0;", var_NT);
indout ("uintptr_t SAC_DISTMEM_MIRROR_OFFS( %s) = 0;", var_NT);
break;
......
......@@ -741,6 +741,20 @@ ICMCompileND_DECL__MIRROR_PARAM (char *var_NT, int sdim, int *shp)
indout ("const int SAC_ND_A_MIRROR_SIZE( %s) = %d;\n", var_NT, size);
indout ("const int SAC_ND_A_MIRROR_DIM( %s) = %d;\n", var_NT, dim);
if (global.backend == BE_distmem) {
indout ("const bool SAC_DISTMEM_MIRROR_IS_DIST( %s) = "
"SAC_DISTMEM_DET_DO_DISTR_ARR( %d, %d);\n",
var_NT, size, shp[0]);
/*
* Initialize these variables to 0 to avoid warnings.
* If the array is distributed, they will be set to the correct values
* when the array is allocated. *
*/
indout ("size_t SAC_DISTMEM_MIRROR_FIRST_ELEMS( %s) = 0;", var_NT);
indout ("uintptr_t SAC_DISTMEM_MIRROR_OFFS( %s) = 0;", var_NT);
}
break;
case C_akd:
......
......@@ -191,13 +191,16 @@ AddDistMemLib (str_buf *buffer)
{
DBUG_ENTER ();
SBUFprint (buffer, "-lsacdistmem");
if (global.backend == BE_distmem) {
SBUFprint (buffer, "-lsacdistmem");
switch (global.distmem_commlib) {
case DISTMEM_COMMLIB_GASNET:
SBUFprintf (buffer, ".gasnet%s ", global.config.commlib_conduit);
break;
}
} else {
SBUFprintf (buffer, ".nodistmem ");
}
DBUG_RETURN ();
......
......@@ -6029,6 +6029,12 @@ Type2OldType (ntype *xnew)
res = Type2OldType (AKS_BASE (xnew));
TYPES_DIM (res) = SHgetDim (AKS_SHP (xnew));
TYPES_SHPSEG (res) = SHshape2OldShpseg (AKS_SHP (xnew));
// TODO: Think of suitable condition.
if (global.backend == BE_distmem) {
TYPES_DISTRIBUTED (res) = TRUE;
} else {
TYPES_DISTRIBUTED (res) = FALSE;
}
break;
case TC_akd:
res = Type2OldType (AKD_BASE (xnew));
......
......@@ -94,7 +94,7 @@ SAC_DISTMEM_COMMLIB_Setup (size_t maxmem)
size_t i;
/* Print GASNet configuration. */
SAC_TR_DISTMEM_PRINT ((GASNET_CONFIG_STRING));
SAC_TR_DISTMEM_PRINT (GASNET_CONFIG_STRING);
SAC_DISTMEM_rank = gasnet_mynode ();
SAC_DISTMEM_size = gasnet_nodes ();
......
......@@ -21,15 +21,6 @@
#define COMPILE_TRACE 0
#endif /* !defined(COMPILE_TRACE) */
/*
* Silence empty source file warning.
*/
static UNUSED int SAC_DISTMEM_COMMLIB_dummy;
#ifdef COMPILE_DISTMEM
#if ENABLE_DISTMEM
#if COMPILE_TRACE
#define SAC_DO_TRACE 1
#define SAC_DO_TRACE_DISTMEM 1
......@@ -47,6 +38,29 @@ static UNUSED int SAC_DISTMEM_COMMLIB_dummy;
#include "distmem_commlib.h"
/*
* Silence empty source file warning.
*/
static UNUSED int SAC_DISTMEM_COMMLIB_dummy;
#if !COMPILE_TRACE
/*
* If we compile for distmem_trace.o, we don't need the global variables since
* these always remain in distmem.o (without tracing).
*/
/*
* Rank of this node
* For tracing purposes we also need this when the distributed memory backend
* is disabled. Therefore, it is also included into libsacdistmem.nodistmem
*/
size_t SAC_DISTMEM_rank = SAC_DISTMEM_RANK_UNDEFINED;
#endif
#ifdef COMPILE_DISTMEM
#if ENABLE_DISTMEM
/*
* Protects memory starting at page_ptr
* against read and write accesses.
......@@ -146,7 +160,7 @@ SegvHandler (int sig, siginfo_t *si, void *unused)
/* Calculate the rank of the owner of the requested memory address. */
size_t owner_rank
= (uintptr_t)si->si_addr - (uintptr_t)SAC_DISTMEM_cache_ptr / SAC_DISTMEM_segsz;
= ((uintptr_t)si->si_addr - (uintptr_t)SAC_DISTMEM_cache_ptr) / SAC_DISTMEM_segsz;
/* The local cache segments form a coherent memory area but there is no
* cache segment for this node. Therefore, add 1 in case the result is
* greater or equal than the rank of this node.
......@@ -180,6 +194,8 @@ SegvHandler (int sig, siginfo_t *si, void *unused)
/* Make the page writable so that it can be loaded from its owner. */
SAC_DISTMEM_PROT_PAGE_WRITE (local_page_ptr);
SAC_TR_DISTMEM_PRINT ("Fetching page %zd from %zd", remote_page_index, owner_rank);
/* Load the page from its owner node. */
SAC_DISTMEM_COMMLIB_LOAD_PAGE (local_page_ptr, owner_rank, remote_page_index);
......@@ -259,11 +275,11 @@ SAC_DISTMEM_Setup (size_t maxmem_mb)
* system page size. */
size_t maxmem = maxmem_mb * 1024 * 1024 / SAC_DISTMEM_pagesz * SAC_DISTMEM_pagesz;
SAC_TR_DISTMEM_PRINT (("Setting up communication library."));
SAC_TR_DISTMEM_PRINT ("Setting up communication library.");
SAC_DISTMEM_COMMLIB_SETUP (maxmem);
SAC_TR_DISTMEM_PRINT (("Rank: %d, size: %d", SAC_DISTMEM_rank, SAC_DISTMEM_size));
SAC_TR_DISTMEM_PRINT ("Size: %d", SAC_DISTMEM_size);
/* Initalize the offset to the free memory in the shared segment. */
SAC_DISTMEM_seg_free_offs = 0;
......@@ -280,9 +296,9 @@ SAC_DISTMEM_Setup (size_t maxmem_mb)
SAC_DISTMEM_INVAL_ENTIRE_CACHE ();
#if COMPILE_TRACE
SAC_TR_DISTMEM_PRINT (("Allocated memory: %zd MB per segment, %zd MB in total",
SAC_DISTMEM_segsz / 1024 / 1024,
SAC_DISTMEM_segsz * SAC_DISTMEM_size / 1024 / 1024));
SAC_TR_DISTMEM_PRINT ("Allocated memory: %zd MB per segment, %zd MB in total",
SAC_DISTMEM_segsz / 1024 / 1024,
SAC_DISTMEM_segsz * SAC_DISTMEM_size / 1024 / 1024);
#endif
/* Init pointers to local memory segment per node. */
......@@ -290,11 +306,15 @@ SAC_DISTMEM_Setup (size_t maxmem_mb)
for (i = 0; i < SAC_DISTMEM_rank; i++) {
SAC_DISTMEM_local_seg_ptrs[i]
= (void *)((uintptr_t)SAC_DISTMEM_cache_ptr + SAC_DISTMEM_segsz * i);
SAC_TR_DISTMEM_PRINT ("\tSegment of %zd: %p\n", i, SAC_DISTMEM_local_seg_ptrs[i]);
}
SAC_DISTMEM_local_seg_ptrs[SAC_DISTMEM_rank] = SAC_DISTMEM_shared_seg_ptr;
SAC_TR_DISTMEM_PRINT ("\tSegment of %zd: %p\n", SAC_DISTMEM_rank,
SAC_DISTMEM_local_seg_ptrs[SAC_DISTMEM_rank]);
for (i = SAC_DISTMEM_rank + 1; i < SAC_DISTMEM_size; i++) {
SAC_DISTMEM_local_seg_ptrs[i]
= (void *)((uintptr_t)SAC_DISTMEM_cache_ptr + SAC_DISTMEM_segsz * (i - 1));
SAC_TR_DISTMEM_PRINT ("\tSegment of %zd: %p\n", i, SAC_DISTMEM_local_seg_ptrs[i]);
}
}
......@@ -347,11 +367,11 @@ void
SAC_DISTMEM_Barrier (void)
#endif /* COMPILE_TRACE */
{
SAC_TR_DISTMEM_PRINT (("%d before barrier.", SAC_DISTMEM_rank));
SAC_TR_DISTMEM_PRINT ("Before barrier.");
SAC_DISTMEM_COMMLIB_BARRIER ();
SAC_TR_DISTMEM_PRINT (("%d after barrier.", SAC_DISTMEM_rank));
SAC_TR_DISTMEM_PRINT ("After barrier.");
}
#if COMPILE_TRACE
......@@ -362,11 +382,11 @@ void
SAC_DISTMEM_Exit (void)
#endif /* COMPILE_TRACE */
{
SAC_TR_DISTMEM_PRINT (("%d exiting communication library.", SAC_DISTMEM_rank));
SAC_TR_DISTMEM_PRINT ("Exiting communication library.");
SAC_TR_DISTMEM_PRINT (("\t Invalidated pages: %lu", SAC_DISTMEM_TR_num_inval_pages));
SAC_TR_DISTMEM_PRINT (("\t Seg faults: %lu", SAC_DISTMEM_TR_num_segfaults));
SAC_TR_DISTMEM_PRINT (("\t Pointer calulations: %lu", SAC_DISTMEM_TR_num_ptr_calcs));
SAC_TR_DISTMEM_PRINT ("\t Invalidated pages: %lu", SAC_DISTMEM_TR_num_inval_pages);
SAC_TR_DISTMEM_PRINT ("\t Seg faults: %lu", SAC_DISTMEM_TR_num_segfaults);
SAC_TR_DISTMEM_PRINT ("\t Pointer calulations: %lu", SAC_DISTMEM_TR_num_ptr_calcs);
SAC_DISTMEM_COMMLIB_EXIT ();
}
......@@ -398,7 +418,7 @@ SAC_DISTMEM_DetDoDistrArr (size_t total_elems, size_t dim0_size)
}
}
SAC_TR_DISTMEM_PRINT (("Distribute array of size %zd? %d", total_elems, do_dist));
SAC_TR_DISTMEM_PRINT ("Distribute array of size %zd? %d", total_elems, do_dist);
return do_dist;
}
......@@ -414,9 +434,9 @@ SAC_DISTMEM_DetMaxElemsPerNode (size_t total_elems, size_t dim0_size)
size_t max_dim0 = DetMaxDim0SharePerNode (dim0_size);
size_t max_elems = max_dim0 * total_elems / dim0_size;
SAC_TR_DISTMEM_PRINT (("Maximum number of elements/dim0 share per node is %zd/%zd "
"for array of size/dim0 %zd/%zd.",
max_elems, max_dim0, total_elems, dim0_size));
SAC_TR_DISTMEM_PRINT ("Maximum number of elements/dim0 share per node is %zd/%zd for "
"array of size/dim0 %zd/%zd.",
max_elems, max_dim0, total_elems, dim0_size);
return max_elems;
}
......@@ -432,8 +452,7 @@ SAC_DISTMEM_DetDim0Start (size_t dim0_size)
size_t max_dim0 = DetMaxDim0SharePerNode (dim0_size);
size_t start = max_dim0 * SAC_DISTMEM_rank;
SAC_TR_DISTMEM_PRINT (("Node %zd starts at dim0 = %zd (size of dim0: %zd)",
SAC_DISTMEM_rank, start, dim0_size));
SAC_TR_DISTMEM_PRINT ("Starts at dim0 = %zd (size of dim0: %zd)", start, dim0_size);
return start;
}
......@@ -450,8 +469,7 @@ SAC_DISTMEM_DetDim0Stop (size_t dim0_size)
size_t start = max_dim0 * SAC_DISTMEM_rank;
size_t stop = SAC_MIN (start + max_dim0, dim0_size);
SAC_TR_DISTMEM_PRINT (("Node %zd stops at dim0 = %zd (size of dim0: %zd)",
SAC_DISTMEM_rank, stop, dim0_size));
SAC_TR_DISTMEM_PRINT ("Stops at dim0 = %zd (size of dim0: %zd)", stop, dim0_size);
return stop;
}
......@@ -471,8 +489,8 @@ SAC_DISTMEM_Malloc (size_t b, uintptr_t *offset)
SAC_RuntimeError ("Out of memory: DSM segment size exceeded.");
}
SAC_TR_DISTMEM_PRINT (
("Allocated %zd B at offset %" PRIuPTR " in shared segment.", b, *offset));
SAC_TR_DISTMEM_PRINT ("Allocated %zd B at offset %" PRIuPTR " in shared segment.", b,
*offset);
return (void *)(((uintptr_t)SAC_DISTMEM_shared_seg_ptr) + *offset);
}
......
......@@ -164,7 +164,7 @@ $(PROJECT_ROOT)/src/bin/%: $(SUBTARGETS)
################################################################################
#
# Building libsac2c
# Building libsac2cCROSS
#
$(PROJECT_ROOT)/lib/libsac2c$(SHARED_LIB_EXT): $(PROJECT_ROOT)/lib/libsac2c.$($(STYLE)_short)$(SHARED_LIB_EXT)
......@@ -298,7 +298,7 @@ $(PROJECT_ROOT)/lib/libsacphm$(CROSS_VARIANT)%$(SHARED_LIB_EXT): $(SUBTARGETS:.o
@$(CLOCK_SKEW_ELIMINATION)
$(PROJECT_ROOT)/lib/libsacdistmem$(CROSS_VARIANT)%.a: $(SUBTARGETS:.o=%.o)
$(PROJECT_ROOT)/lib/libsacdistmem$(CROSS_VARIANT)%.a: $(SUBTARGETS:.o=%.o) $(PROJECT_ROOT)/include/sac.h
@$(ECHO) ""
@$(ECHO) "Creating $(PREFIX_ROOT)lib/libsacdistmem$(CROSS_VARIANT)$*.a " \
"($($(STYLE)_long) version) $(CROSS_FOR)"
......@@ -307,7 +307,7 @@ $(PROJECT_ROOT)/lib/libsacdistmem$(CROSS_VARIANT)%.a: $(SUBTARGETS:.o=%.o)
@$(TOUCH) .done
@$(CLOCK_SKEW_ELIMINATION)
$(PROJECT_ROOT)/lib/libsacdistmem$(CROSS_VARIANT)%$(SHARED_LIB_EXT): $(SUBTARGETS:.o=%.o)
$(PROJECT_ROOT)/lib/libsacdistmem$(CROSS_VARIANT)%$(SHARED_LIB_EXT): $(SUBTARGETS:.o=%.o) $(PROJECT_ROOT)/include/sac.h
@$(ECHO) ""
@$(ECHO) "Creating $(PREFIX_ROOT)lib/libsacdistmem$(CROSS_VARIANT)$*$(SHARED_LIB_EXT) " \
"($($(STYLE)_long) version) $(CROSS_FOR)"
......@@ -511,15 +511,14 @@ codegen/fancy_icm_vars.c: codegen/icm_vars.c codegen/icm.data
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
DISTMEMTODO := $(subst ee,EE,feet on the street)
# Compile libsacdistmem GASNet files
# The rules for the libsacdistmem GASNet object files are generated by configure.
# Compile libsacdistmem.gasnet files
# The rules for the libsacdistmem.gasnet object files are generated by configure.
# We cannot use a pattern rule with more than one target for the following reason:
# Pattern rules may have more than one target. Unlike normal rules,
# this does not act as many different rules with the same prerequisites and commands.
# If a pattern rule has multiple targets, make knows that the rule's commands are
# responsible for making all of the targets. The commands are executed only once to make all the targets.
%.$($(STYLE)_short).gasnetibv.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
......@@ -569,7 +568,7 @@ DISTMEMTODO := $(subst ee,EE,feet on the street)
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
# Compile libsacdistmem MPI files
# Compile libsacdistmem.mpi files
%.$($(STYLE)_short).mpi.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
......@@ -583,6 +582,21 @@ DISTMEMTODO := $(subst ee,EE,feet on the street)
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
# Compile libsacdistmem.nodistmem files
%.$($(STYLE)_short).nodistmem.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir $@)"; \
fi
@$(ECHO) " Compiling $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(CC_$($(STYLE)_cap)) \
$(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
%.$($(STYLE)_short).o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
......@@ -601,7 +615,6 @@ DISTMEMTODO := $(subst ee,EE,feet on the street)
#TODO: What is cross-variant, do we need that?
ifneq ($(CROSS_VARIANT),)
%.$($(STYLE)_short)$(CROSS_VARIANT).mt.diag.o: %.c
......@@ -721,6 +734,138 @@ ifneq ($(CROSS_VARIANT),)
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
# Compile libsacdistmem.gasnet files
# The rules for the libsacdistmem.gasnet object files are generated by configure.
# We cannot use a pattern rule with more than one target for the following reason:
# Pattern rules may have more than one target. Unlike normal rules,
# this does not act as many different rules with the same prerequisites and commands.
# If a pattern rule has multiple targets, make knows that the rule's commands are
# responsible for making all of the targets. The commands are executed only once to make all the targets.
%.$($(STYLE)_short)$(CROSS_VARIANT).gasnetibv.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir \)"; \
fi
@$(ECHO) " Compiling GasNET ibv $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(GASNET_IBV_CC) \
$(GASNET_IBV_CPPFLAGS) $(GASNET_IBV_CFLAGS) $(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) $(SETTINGS_DISTMEM) $(SETTINGS_DISTMEM_GASNET) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
%.$($(STYLE)_short)$(CROSS_VARIANT).gasnetmpi.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir \)"; \
fi
@$(ECHO) " Compiling GasNET mpi $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(GASNET_MPI_CC) \
$(GASNET_MPI_CPPFLAGS) $(GASNET_MPI_CFLAGS) $(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) $(SETTINGS_DISTMEM) $(SETTINGS_DISTMEM_GASNET) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
%.$($(STYLE)_short)$(CROSS_VARIANT).gasnetsmp.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir \)"; \
fi
@$(ECHO) " Compiling GasNET smp $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(GASNET_SMP_CC) \
$(GASNET_SMP_CPPFLAGS) $(GASNET_SMP_CFLAGS) $(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) $(SETTINGS_DISTMEM) $(SETTINGS_DISTMEM_GASNET) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
%.$($(STYLE)_short)$(CROSS_VARIANT).gasnetudp.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir \)"; \
fi
@$(ECHO) " Compiling GasNET udp $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(GASNET_UDP_CC) \
$(GASNET_UDP_CPPFLAGS) $(GASNET_UDP_CFLAGS) $(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) $(SETTINGS_DISTMEM) $(SETTINGS_DISTMEM_GASNET) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
%.$($(STYLE)_short)$(CROSS_VARIANT).gasnetibv.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir \)"; \
fi
@$(ECHO) " Compiling GasNET ibv $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(GASNET_IBV_CC) \
$(GASNET_IBV_CPPFLAGS) $(GASNET_IBV_CFLAGS) $(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) $(SETTINGS_DISTMEM) $(SETTINGS_DISTMEM_GASNET) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
%.$($(STYLE)_short)$(CROSS_VARIANT).gasnetmpi.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir \)"; \
fi
@$(ECHO) " Compiling GasNET mpi $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(GASNET_MPI_CC) \
$(GASNET_MPI_CPPFLAGS) $(GASNET_MPI_CFLAGS) $(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) $(SETTINGS_DISTMEM) $(SETTINGS_DISTMEM_GASNET) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
%.$($(STYLE)_short)$(CROSS_VARIANT).gasnetsmp.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir \)"; \
fi
@$(ECHO) " Compiling GasNET smp $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(GASNET_SMP_CC) \
$(GASNET_SMP_CPPFLAGS) $(GASNET_SMP_CFLAGS) $(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) $(SETTINGS_DISTMEM) $(SETTINGS_DISTMEM_GASNET) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
%.$($(STYLE)_short)$(CROSS_VARIANT).gasnetudp.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir \)"; \
fi
@$(ECHO) " Compiling GasNET udp $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(GASNET_UDP_CC) \
$(GASNET_UDP_CPPFLAGS) $(GASNET_UDP_CFLAGS) $(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) $(SETTINGS_DISTMEM) $(SETTINGS_DISTMEM_GASNET) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
# Compile libsacdistmem.mpi files
%.$($(STYLE)_short)$(CROSS_VARIANT).mpi.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir $@)"; \
fi
@$(ECHO) " Compiling MPI $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) mpicc -std=gnu99 \
$(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) $(SETTINGS_DISTMEM) $(SETTINGS_DISTMEM_MPI) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
# Compile libsacdistmem.nodistmem files
%.$($(STYLE)_short)$(CROSS_VARIANT).nodistmem.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir $@)"; \
fi
@$(ECHO) " Compiling $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(CC_$($(STYLE)_cap)) \
$(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
%.$($(STYLE)_short)$(CROSS_VARIANT).o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
......
......@@ -164,7 +164,7 @@ $(PROJECT_ROOT)/src/bin/%: $(SUBTARGETS)
################################################################################
#
# Building libsac2c
# Building libsac2cCROSS
#
$(PROJECT_ROOT)/lib/libsac2c$(SHARED_LIB_EXT): $(PROJECT_ROOT)/lib/libsac2c.$($(STYLE)_short)$(SHARED_LIB_EXT)
......@@ -298,7 +298,7 @@ $(PROJECT_ROOT)/lib/libsacphm$(CROSS_VARIANT)%$(SHARED_LIB_EXT): $(SUBTARGETS:.o
@$(CLOCK_SKEW_ELIMINATION)
$(PROJECT_ROOT)/lib/libsacdistmem$(CROSS_VARIANT)%.a: $(SUBTARGETS:.o=%.o)
$(PROJECT_ROOT)/lib/libsacdistmem$(CROSS_VARIANT)%.a: $(SUBTARGETS:.o=%.o) $(PROJECT_ROOT)/include/sac.h
@$(ECHO) ""
@$(ECHO) "Creating $(PREFIX_ROOT)lib/libsacdistmem$(CROSS_VARIANT)$*.a " \
"($($(STYLE)_long) version) $(CROSS_FOR)"
......@@ -307,7 +307,7 @@ $(PROJECT_ROOT)/lib/libsacdistmem$(CROSS_VARIANT)%.a: $(SUBTARGETS:.o=%.o)
@$(TOUCH) .done
@$(CLOCK_SKEW_ELIMINATION)
$(PROJECT_ROOT)/lib/libsacdistmem$(CROSS_VARIANT)%$(SHARED_LIB_EXT): $(SUBTARGETS:.o=%.o)
$(PROJECT_ROOT)/lib/libsacdistmem$(CROSS_VARIANT)%$(SHARED_LIB_EXT): $(SUBTARGETS:.o=%.o) $(PROJECT_ROOT)/include/sac.h
@$(ECHO) ""
@$(ECHO) "Creating $(PREFIX_ROOT)lib/libsacdistmem$(CROSS_VARIANT)$*$(SHARED_LIB_EXT) " \
"($($(STYLE)_long) version) $(CROSS_FOR)"
......@@ -511,18 +511,17 @@ codegen/fancy_icm_vars.c: codegen/icm_vars.c codegen/icm.data
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
DISTMEMTODO := $(subst ee,EE,feet on the street)
# Compile libsacdistmem GASNet files
# The rules for the libsacdistmem GASNet object files are generated by configure.
# Compile libsacdistmem.gasnet files
# The rules for the libsacdistmem.gasnet object files are generated by configure.
# We cannot use a pattern rule with more than one target for the following reason:
# Pattern rules may have more than one target. Unlike normal rules,
# this does not act as many different rules with the same prerequisites and commands.
# If a pattern rule has multiple targets, make knows that the rule's commands are
# responsible for making all of the targets. The commands are executed only once to make all the targets.
@GASNET_CONDUIT_BUILD_OBJECT_FILES@
# Compile libsacdistmem MPI files
# Compile libsacdistmem.mpi files
%.$($(STYLE)_short).mpi.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
......@@ -536,6 +535,21 @@ DISTMEMTODO := $(subst ee,EE,feet on the street)
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
# Compile libsacdistmem.nodistmem files
%.$($(STYLE)_short).nodistmem.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir $@)"; \
fi
@$(ECHO) " Compiling $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(CC_$($(STYLE)_cap)) \
$(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
%.$($(STYLE)_short).o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
......@@ -554,7 +568,6 @@ DISTMEMTODO := $(subst ee,EE,feet on the street)
#TODO: What is cross-variant, do we need that?
ifneq ($(CROSS_VARIANT),)
%.$($(STYLE)_short)$(CROSS_VARIANT).mt.diag.o: %.c
......@@ -674,6 +687,43 @@ ifneq ($(CROSS_VARIANT),)
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
# Compile libsacdistmem.gasnet files
# The rules for the libsacdistmem.gasnet object files are generated by configure.
# We cannot use a pattern rule with more than one target for the following reason:
# Pattern rules may have more than one target. Unlike normal rules,
# this does not act as many different rules with the same prerequisites and commands.
# If a pattern rule has multiple targets, make knows that the rule's commands are
# responsible for making all of the targets. The commands are executed only once to make all the targets.
@GASNET_CONDUIT_BUILD_OBJECT_FILES_CROSS_VARIANT@
# Compile libsacdistmem.mpi files
%.$($(STYLE)_short)$(CROSS_VARIANT).mpi.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir $@)"; \
fi
@$(ECHO) " Compiling MPI $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) mpicc -std=gnu99 \
$(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) $(SETTINGS_DISTMEM) $(SETTINGS_DISTMEM_MPI) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
# Compile libsacdistmem.nodistmem files
%.$($(STYLE)_short)$(CROSS_VARIANT).nodistmem.o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
then $(ECHO) "compile $(dir $*)" > .make_track; \
$(ECHO) ""; \
$(ECHO) "Compiling files in directory $(PREFIX_LOCAL)$(dir $@)"; \
fi
@$(ECHO) " Compiling $($(STYLE)_long) code: $(notdir $<)"
$(HIDE) $(CC_$($(STYLE)_cap)) \
$(CC_FLAGS_$($(STYLE)_cap)) $(SETTINGS_$($(STYLE)_cap)) \
$(CC_FLAGS_YY) \
$(INCDIRS) -o $@ -c $<
@$(CLOCK_SKEW_ELIMINATION)
%.$($(STYLE)_short)$(CROSS_VARIANT).o: %.c
@if [ "compile $(dir $*)" != "`cat .make_track`" ] ; \
......
......@@ -487,7 +487,9 @@ libsacphm_compat := malloc
libsacdistmem_targets := $(foreach gasnet_conduit,$(DISTMEM_GASNET_CONDUITS),libsacdistmem$(CROSS_VARIANT).gasnet$(gasnet_conduit).a libsacdistmem$(CROSS_VARIANT).gasnet$(gasnet_conduit)$(SHARED_LIB_EXT)) \
libsacdistmem$(CROSS_VARIANT).mpi.a \
libsacdistmem$(CROSS_VARIANT).mpi$(SHARED_LIB_EXT)
libsacdistmem$(CROSS_VARIANT).mpi$(SHARED_LIB_EXT) \
libsacdistmem$(CROSS_VARIANT).nodistmem.a \
libsacdistmem$(CROSS_VARIANT).nodistmem$(SHARED_LIB_EXT)
libsacdistmem_targetdir := lib
......
......@@ -17,6 +17,13 @@
/*****************************************************************************/
/* Rank of this node
* We always declare this variable for tracing purposes. */
SAC_C_EXTERN_VAR size_t SAC_DISTMEM_rank;
/* For tracing purposes. */
#define SAC_DISTMEM_RANK_UNDEFINED SIZE_MAX
#if SAC_DO_DISTMEM
/* Minimum elements per node so that array is distributed. */
......@@ -26,9 +33,6 @@
* Global variables
*******************************************/
/* Rank of this node */
SAC_C_EXTERN_VAR size_t SAC_DISTMEM_rank;
/* Number of nodes */
SAC_C_EXTERN_VAR size_t SAC_DISTMEM_size;
......@@ -260,14 +264,24 @@ void *SAC_DISTMEM_TR_Malloc (size_t b, uintptr_t *offset);
*
******************************************************************************/
#define _SAC_DISTMEM_ELEM_POINTER(arr_offset, elem_type, elems_first_nodes, elem_index) \
(elem_type *)((uintptr_t)SAC_DISTMEM_local_seg_ptrs[elem_index / elems_first_nodes] \
+ arr_offset) \
+ elem_index % elems_first_nodes;
((elem_type *)((uintptr_t)SAC_DISTMEM_local_seg_ptrs[elem_index / elems_first_nodes] \
+ arr_offset) \
+ elem_index % elems_first_nodes)
#define _SAC_DISTMEM_TR_ELEM_POINTER(arr_offset, elem_type, elems_first_nodes, \
elem_index) \
SAC_DISTMEM_TR_num_ptr_calcs++; \
_SAC_DISTMEM_ELEM_POINTER (arr_offset, elem_type, elems_first_nodes, elem_index);
(SAC_DISTMEM_TR_num_ptr_calcs++, \
SAC_TR_DISTMEM_PRINT ( \
"Retrieving pointer for element owned by node %zd (segment starting at: %p), " \
"offset within segment: %zd, element address: %p", \
elem_index / elems_first_nodes, \
(elem_type *)((uintptr_t) \
SAC_DISTMEM_local_seg_ptrs[elem_index / elems_first_nodes] \
+ arr_offset), \
elem_index % elems_first_nodes, \
_SAC_DISTMEM_ELEM_POINTER (arr_offset, elem_type, elems_first_nodes, \
elem_index)), \
_SAC_DISTMEM_ELEM_POINTER (arr_offset, elem_type, elems_first_nodes, elem_index))
/** <!--********************************************************************-->
*
......@@ -317,7 +331,7 @@ void *SAC_DISTMEM_TR_Malloc (size_t b, uintptr_t *offset);
#define SAC_DISTMEM_MALLOC(b, offset) SAC_DISTMEM_TR_Malloc (b, offset);
#define SAC_DISTMEM_ELEM_POINTER(arr_offset, elem_type, elems_first_nodes, elem_index) \
_SAC_DISTMEM_TR_ELEM_POINTER (arr_offset, elem_type, elems_first_nodes, elem_index);
_SAC_DISTMEM_TR_ELEM_POINTER (arr_offset, elem_type, elems_first_nodes, elem_index)
#define SAC_DISTMEM_RECALC_INDEX(elems_first_nodes, elem_index) \
_SAC_DISTMEM_TR_RECALC_INDEX (elems_first_nodes, elem_index);
......@@ -349,7 +363,7 @@ void *SAC_DISTMEM_TR_Malloc (size_t b, uintptr_t *offset);
#define SAC_DISTMEM_MALLOC(b, offset) SAC_DISTMEM_Malloc (b, offset);
#define SAC_DISTMEM_ELEM_POINTER(arr_offset, elem_type, elems_first_nodes, elem_index) \
_SAC_DISTMEM_ELEM_POINTER (arr_offset, elem_type, elems_first_nodes, elem_index);
_SAC_DISTMEM_ELEM_POINTER (arr_offset, elem_type, elems_first_nodes, elem_index)
#define SAC_DISTMEM_RECALC_INDEX(elems_first_nodes, elem_index) \
_SAC_DISTMEM_RECALC_INDEX (elems_first_nodes, elem_index);
......@@ -375,6 +389,9 @@ void *SAC_DISTMEM_TR_Malloc (size_t b, uintptr_t *offset);
#define SAC_DISTMEM_EXIT()
/* TODO: Prelude needs this */
#define SAC_DISTMEM_ELEM_POINTER(arr_offset, elem_type, elems_first_nodes, elem_index) 0
/*
* We do not define the following macros because they
* should never be called when the distributed memory
......
......@@ -71,7 +71,7 @@
SAC_DISTMEM_MALLOC_FIXED_SIZE_WITH_DESC (SAC_ND_A_FIELD (var_NT), \
SAC_ND_A_DESC (var_NT), \
SAC_DISTMEM_MIRROR_OFFS (var_NT), \
SAC_ND_A_MIRROR_SIZE (var_NT) \
SAC_DISTMEM_MIRROR_FIRST_ELEMS (var_NT) \
* sizeof (*SAC_ND_A_FIELD (var_NT)), \
SAC_ND_A_MIRROR_DIM (var_NT), basetype, \
SAC_ND_DESC_BASETYPE (var_NT)) \
......@@ -89,11 +89,11 @@
#define SAC_DISTMEM_ALLOC_BEGIN__DAO(var_NT, rc, dim, basetype) \
{ \
if (SAC_DISTMEM_MIRROR_IS_DIST (var_NT) == TRUE) { \
SAC_TR_DISTMEM_PRINT ( \
("Allocating dsm memory for array: %s", NT_STR (var_NT))); \
uintptr_t SAC_DISTMEM_MIRROR_OFFS (var_NT); \
const size_t SAC_DISTMEM_MIRROR_FIRST_ELEMS (var_NT) \
if (SAC_DISTMEM_MIRROR_IS_DIST (var_NT)) { \
SAC_TR_DISTMEM_PRINT ("Allocating dsm memory for array: %s", \
NT_STR (var_NT)); \
\
SAC_DISTMEM_MIRROR_FIRST_ELEMS (var_NT) \
= SAC_DISTMEM_DET_MAX_ELEMS_PER_NODE (SAC_ND_A_MIRROR_SIZE (var_NT), \
SAC_ND_A_MIRROR_SHAPE (var_NT, 0)); \
\
......
......@@ -265,11 +265,6 @@ SAC_ND_ALLOC__DATA__NOOP(__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_SCLHNSNUQ(...) SAC_ND_DEC_RC_FREE__NOOP (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_SCLHIDNUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_SCL___NUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AKSNHDNUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AKSHIDNUQ(...) \
......@@ -278,30 +273,23 @@ SAC_ND_ALLOC__DATA__NOOP(__VA_ARGS__)
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AKS___NUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AKDNHDNUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AKDHIDNUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AKDHNSNUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AKD___NUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AUDNHDNUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AUDHIDNUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AUDHNSNUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AUD___NUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE____NHDNUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE____HIDNUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE____HNSNUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_______NUQ(...) \
SAC_DISTMEM_DEC_RC_FREE__DEFAULT (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_SCLHIDNUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_SCL___NUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AKDNHDNUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AKDHIDNUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AKDHNSNUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AKD___NUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AUDNHDNUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AUDHIDNUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AUDHNSNUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_AUD___NUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE____NHDNUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE____HIDNUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE____HNSNUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define SAC_DISTMEM_DEC_RC_FREE_______NUQ(...) SAC_ND_DEC_RC_FREE (__VA_ARGS__)
#define CAT_M4_distmem_icm_gen_11(x, y) xCAT_M4_distmem_icm_gen_11 (x, y)
#define xCAT_M4_distmem_icm_gen_11(x, y) x##y
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment