Last commit for debug.h: 8a155c1522c0818d43b6bae4cc5806ea41f88793

Parallel md code using OpenMP and MPI

Ramses van Zon [2016-09-29 14:34:01]
Parallel md code using OpenMP and MPI
#ifndef DEBUG_H
#define DEBUG_H

#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

#ifndef NDEBUG
 #ifndef ATTACHCHECKUBUNTU
  #define ATTACHCHECKUBUNTU {char blockingfile[]="/proc/sys/kernel/yama/ptrace_scope"; FILE* f=fopen(blockingfile,"r"); if (f) { char c=getc(f); if (c=='1') fprintf(stderr,"sudo sh -c 'echo 0 > %s'\n",blockingfile); fclose(f);} }
 #endif
 #ifndef EMACSDEBUG
  #define EMACSDEBUG {ATTACHCHECKUBUNTU; int i=0;fprintf(stderr,"\nemacs -q -fn 6x12 -T rank%d --eval '(gdb \"gdb --annotate=1 -q -i=mi -ex finish -ex finish -ex \\\"set var i=1\\\" -ex next ./pardy -p %d\")'&\n",global_rank,getpid());while(0==i)sleep(5);}
 #endif
 #ifndef XTERMDEBUG
  #define XTERMDEBUG {ATTACHCHECKUBUNTU; int i=0;fprintf(stderr,"\nxterm -fn 6x12 -geometry 100x25 -T rank%d -e 'gdb -tui -q -ex finish -ex finish -ex \"set var i=1\" -ex next ./pardy -p %d'&\n",global_rank,getpid());while(0==i)sleep(5);}
 #endif
#else
 #ifndef EMACSDEBUG
  #define EMACSDEBUG do{;}while(0)
 #endif
 #ifndef XTERMDEBUG
  #define XTERMDEBUG do{;}while(0)
 #endif
#endif

#define ENTERDEBUGGER  \
    if (argc>1 && strncmp(argv[1],"-e", 3)==0) {                    \
        argv++; argc--; EMACSDEBUG;                       \
    } else if (argc>1 && strncmp(argv[1],"-x",3)==0) {              \
        argv++; argc--; XTERMDEBUG;                       \
    }

#ifndef NDEBUG

/* Print functions used in specialized asserts; these leak memory
   like crazy, but should only be used just before the program crashes
   anyway. */

#define maxoutchars 60
static char* floatprint(double x)
{
    char* s=malloc(maxoutchars);
    snprintf(s, maxoutchars, "%e", x);
    return s;
}
static char* doubleprint(double x)
{
    char* s=malloc(maxoutchars);
    snprintf(s, maxoutchars, "%e", x);
    return s;
}
static char* intprint(int x){
    char* s=malloc(maxoutchars);
    snprintf(s, maxoutchars, "%d", x);
    return s;
}
static char* longprint(long x){
    char* s=malloc(maxoutchars);
    snprintf(s, maxoutchars, "%ld", x);
    return s;
}
static char* longunsignedprint(long unsigned x){
    char* s=malloc(maxoutchars);
    snprintf(s, maxoutchars, "%lu", x);
    return s;
}
/* static char* mpirequestprint(int n, MPI_Request x[]) { */
/*     char* s=malloc(n*maxoutchars); */
/*     char* r=s; */
/*     s += snprintf(s, 2, "{"); */
/*     for (int i=0;i<n;i++) */
/*         s += snprintf(s, maxoutchars, "[%d]=%p, ", i,x[i]); */
/*     s += snprintf(s-2, 2, "}"); */
/*     return r; */
/* } */

#define printg(x) _Generic((x), int: intprint(x), long: longprint(x), long unsigned: longunsignedprint(x), float: floatprint(x), double: doubleprint(x), char: (&(x)), char*: x)

/* specialize asserts */

#define assert_eq(a,b) if(!(a==b)){fprintf(stderr,"%s:%s %s:%s @%d\n",#a,printg(a),#b,printg(b),global_rank);assert(a==b);}
#define assert_neq(a,b) if(!(a!=b)){fprintf(stderr,"%s:%s %s:%s @%d\n",#a,printg(a),#b,printg(b),global_rank);assert(a!=b);}
#define assert_lt(a,b) if(!(a<b)){fprintf(stderr,"%s:%s %s:%s @%d\n",#a,printg(a),#b,printg(b),global_rank);assert(a<b);}
#define assert_le(a,b) if(!(a<=b)){fprintf(stderr,"%s:%s %s:%s @%d\n",#a,printg(a),#b,printg(b),global_rank);assert(a<=b);}
#define assert_gt(a,b) if(!(a>b)){fprintf(stderr,"%s:%s %s:%s @%d\n",#a,printg(a),#b,printg(b),global_rank);assert(a==b);}
#define assert_ge(a,b) if(!(a>=b)){fprintf(stderr,"%s:%s %s:%s @%d\n",#a,printg(a),#b,printg(b),global_rank);assert(a>=b);}
#else
#define assert_eq(a,b)
#define assert_neq(a,b)
#define assert_lt(a,b)
#define assert_le(a,b)
#define assert_gt(a,b)
#define assert_ge(a,b)
#endif

#endif
ViewGit