From 58ee56a8528602c343a4c45936d98d065fa3ea57 Mon Sep 17 00:00:00 2001 From: Jan Thorbecke <jan@cray.com> Date: Tue, 27 Sep 2016 13:39:05 +0200 Subject: [PATCH] adding missing file --- fdelmodc/fdelmodc.c | 4 +- fdelmodc/threadAffinity.c | 107 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 109 insertions(+), 2 deletions(-) create mode 100644 fdelmodc/threadAffinity.c diff --git a/fdelmodc/fdelmodc.c b/fdelmodc/fdelmodc.c index 4b49388..c803803 100644 --- a/fdelmodc/fdelmodc.c +++ b/fdelmodc/fdelmodc.c @@ -12,7 +12,7 @@ double wallclock_time(void); -void threadAfficity(void); +void threadAffinity(void); int getParameters(modPar *mod, recPar *rec, snaPar *sna, wavPar *wav, srcPar *src, shotPar *shot, bndPar *bnd, int verbose); @@ -505,7 +505,7 @@ shared (tt, t2, t3) \ shared (shot, bnd, mod, src, wav, rec, ixsrc, izsrc, it, src_nwav, verbose) { if (it==it0) { - threadAfficity(); + threadAffinity(); } switch ( mod.ischeme ) { // case -2 : /* test code for PML */ diff --git a/fdelmodc/threadAffinity.c b/fdelmodc/threadAffinity.c new file mode 100644 index 0000000..8a49f7d --- /dev/null +++ b/fdelmodc/threadAffinity.c @@ -0,0 +1,107 @@ +#define _GNU_SOURCE + +#include <stdio.h> +#include <unistd.h> +#include <string.h> +#include <omp.h> + +#ifdef __USE_GNU +#include <sched.h> +#else /* for OSX */ + +#include <sched.h> +#include <sys/types.h> +#include <sys/sysctl.h> + +#define CPU_SETSIZE 1024 +#define SYSCTL_CORE_COUNT "machdep.cpu.core_count" + +typedef struct cpu_set { + uint32_t count; +} cpu_set_t; + +static inline void +CPU_ZERO(cpu_set_t *cs) { cs->count = 0; } + +static inline void +CPU_SET(int num, cpu_set_t *cs) { cs->count |= (1 << num); } + +static inline int +CPU_ISSET(int num, cpu_set_t *cs) { return (cs->count & (1 << num)); } + +int sched_getaffinity(pid_t pid, size_t cpu_size, cpu_set_t *cpu_set) +{ + int32_t core_count = 0; + size_t len = sizeof(core_count); + int ret = sysctlbyname(SYSCTL_CORE_COUNT, &core_count, &len, 0, 0); + if (ret) { + printf("error while get core count %d\n", ret); + return -1; + } + cpu_set->count = 0; + for (int i = 0; i < core_count; i++) { + cpu_set->count |= (1 << i); + } + + return 0; +} +#endif + +/* Borrowed from util-linux-2.13-pre7/schedutils/taskset.c */ + +static char *cpuset_to_cstr(cpu_set_t *mask, char *str) +{ + char *ptr = str; + int i, j, entry_made = 0; + for (i = 0; i < CPU_SETSIZE; i++) { + if (CPU_ISSET(i, mask)) { + int run = 0; + entry_made = 1; + for (j = i + 1; j < CPU_SETSIZE; j++) { + if (CPU_ISSET(j, mask)) run++; + else break; + } + if (!run) + sprintf(ptr, "%d,", i); + else if (run == 1) { + sprintf(ptr, "%d,%d,", i, i + 1); + i++; + } else { + sprintf(ptr, "%d-%d,", i, i + run); + i += run; + } + while (*ptr != 0) ptr++; + } + } + ptr -= entry_made; + *ptr = 0; + return(str); +} + +void threadAffinity(void) +{ + int rank, thread; + cpu_set_t coremask; + char clbuf[7 * CPU_SETSIZE], hnbuf[64]; + char prefix[200]; + + memset(clbuf, 0, sizeof(clbuf)); + memset(hnbuf, 0, sizeof(hnbuf)); + (void)gethostname(hnbuf, sizeof(hnbuf)); + + strcpy(prefix,"Hello world from"); + +// #pragma omp parallel private(thread, coremask, clbuf) +/* for use inside parallel region */ + #pragma omp critical + { + thread = omp_get_thread_num(); + (void)sched_getaffinity(0, sizeof(coremask), &coremask); + cpuset_to_cstr(&coremask, clbuf); + printf("%s thread %d, on %s. (core affinity = %s)\n", + prefix, thread, hnbuf, clbuf); + + } + return; +} + -- GitLab