diff options
author | Birte Kristina Friesel <birte.friesel@uos.de> | 2024-07-04 09:40:07 +0200 |
---|---|---|
committer | Birte Kristina Friesel <birte.friesel@uos.de> | 2024-07-04 09:40:07 +0200 |
commit | b08b2c4c2a51e9e49c6d38a153ca5e0269e8272b (patch) | |
tree | 2326d92d33f898194a7357261466adba3c56ad68 /GEMV/baselines/cpu/gemv_openmp.c | |
parent | 6ea34c34074793b4989614207ffe414cd3824e6b (diff) |
GEMV: Add NUMA variant for HBM evaluation
Diffstat (limited to 'GEMV/baselines/cpu/gemv_openmp.c')
-rw-r--r-- | GEMV/baselines/cpu/gemv_openmp.c | 88 |
1 files changed, 86 insertions, 2 deletions
diff --git a/GEMV/baselines/cpu/gemv_openmp.c b/GEMV/baselines/cpu/gemv_openmp.c index df70be3..3af84e5 100644 --- a/GEMV/baselines/cpu/gemv_openmp.c +++ b/GEMV/baselines/cpu/gemv_openmp.c @@ -1,22 +1,100 @@ #include <stdlib.h> #include <stdio.h> #include "../../support/timer.h" + +#if NUMA +#include <numaif.h> +#include <numa.h> + +struct bitmask* bitmask_in; +struct bitmask* bitmask_out; + +void* mp_pages[1]; +int mp_status[1]; +int mp_nodes[1]; +int numa_node_in = -1; +int numa_node_out = -1; +int numa_node_cpu = -1; +#endif + #include "gemv_utils.h" int main(int argc, char *argv[]) { + (void) argc; const size_t rows = 20480; const size_t cols = 8192; double **A, *b, *x; +#if NUMA + bitmask_in = numa_parse_nodestring(argv[1]); + bitmask_out = numa_parse_nodestring(argv[2]); + numa_node_cpu = atoi(argv[3]); +#endif + +#if NUMA + if (bitmask_out) { + numa_set_membind(bitmask_out); + numa_free_nodemask(bitmask_out); + } + b = (double*) numa_alloc(sizeof(double)*rows); +#else b = (double*) malloc(sizeof(double)*rows); +#endif + +#if NUMA + if (bitmask_in) { + numa_set_membind(bitmask_in); + // no free yet, re-used in allocate_dense + } + x = (double*) numa_alloc(sizeof(double)*cols); +#else x = (double*) malloc(sizeof(double)*cols); +#endif allocate_dense(rows, cols, &A); make_hilbert_mat(rows,cols, &A); +#if NUMA + struct bitmask *bitmask_all = numa_allocate_nodemask(); + numa_bitmask_setall(bitmask_all); + numa_set_membind(bitmask_all); + numa_free_nodemask(bitmask_all); +#endif + +#if NUMA + mp_pages[0] = A; + if (move_pages(0, 1, mp_pages, NULL, mp_status, 0) == -1) { + perror("move_pages(A)"); + } + else if (mp_status[0] < 0) { + printf("move_pages(A) error: %d", mp_status[0]); + } + else { + numa_node_in = mp_status[0]; + } + + mp_pages[0] = b; + if (move_pages(0, 1, mp_pages, NULL, mp_status, 0) == -1) { + perror("move_pages(b)"); + } + else if (mp_status[0] < 0) { + printf("move_pages(b) error: %d", mp_status[0]); + } + else { + numa_node_out = mp_status[0]; + } + + if (numa_node_cpu != -1) { + if (numa_run_on_node(numa_node_cpu) == -1) { + perror("numa_run_on_node"); + numa_node_cpu = -1; + } + } +#endif + Timer timer; for (int i = 0; i < 100; i++) { @@ -41,9 +119,15 @@ int main(int argc, char *argv[]) start(&timer, 0, 0); gemv(A, x, rows, cols, &b); stop(&timer, 0); - printf("[::] GEMV CPU | n_threads=%d e_type=%s n_elements=%d " - "| throughput_MBps=%f", + printf("[::] GEMV CPU | n_threads=%d e_type=%s n_elements=%ld" +#if NUMA + " numa_node_in=%d numa_node_out=%d numa_node_cpu=%d numa_distance_in_cpu=%d numa_distance_cpu_out=%d" +#endif + " | throughput_MBps=%f", nr_threads, "double", rows * cols, +#if NUMA + numa_node_in, numa_node_out, numa_node_cpu, numa_distance(numa_node_in, numa_node_cpu), numa_distance(numa_node_cpu, numa_node_out), +#endif rows * cols * sizeof(double) / timer.time[0]); printf(" throughput_MOpps=%f", rows * cols / timer.time[0]); |