summaryrefslogtreecommitdiff
path: root/BS/baselines/cpu/bs_omp.c
diff options
context:
space:
mode:
Diffstat (limited to 'BS/baselines/cpu/bs_omp.c')
-rw-r--r--BS/baselines/cpu/bs_omp.c82
1 files changed, 71 insertions, 11 deletions
diff --git a/BS/baselines/cpu/bs_omp.c b/BS/baselines/cpu/bs_omp.c
index 3775bce..f160c58 100644
--- a/BS/baselines/cpu/bs_omp.c
+++ b/BS/baselines/cpu/bs_omp.c
@@ -1,4 +1,3 @@
-
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
@@ -10,15 +9,24 @@
#include <stdint.h>
#include "timer.h"
+#if NUMA
+#include <numaif.h>
+#include <numa.h>
+
+void* mp_pages[1];
+int mp_status[1];
+int mp_nodes[1];
+struct bitmask* bitmask_in;
+int numa_node_in = -1;
+int numa_node_cpu = -1;
+#endif
+
#define DTYPE uint64_t
/*
* @brief creates a "test file" by filling a bufferwith values
*/
void create_test_file(DTYPE * input, uint64_t nr_elements, DTYPE * querys, uint64_t n_querys) {
- uint64_t max = UINT64_MAX;
- uint64_t min = 0;
-
srand(time(NULL));
input[0] = 1;
@@ -74,23 +82,63 @@ uint64_t binarySearch(DTYPE * input, uint64_t input_size, DTYPE* querys, unsigne
* @brief Main of the Host Application.
*/
int main(int argc, char **argv) {
-
+ (void)argc;
Timer timer;
uint64_t input_size = atol(argv[1]);
uint64_t n_querys = atol(argv[2]);
+#if NUMA
+ bitmask_in = numa_parse_nodestring(argv[3]);
+ numa_node_cpu = atoi(argv[4]);
+#endif
printf("Vector size: %lu, num searches: %lu\n", input_size, n_querys);
-
+
+#if NUMA
+ if (bitmask_in) {
+ numa_set_membind(bitmask_in);
+ numa_free_nodemask(bitmask_in);
+ }
+ DTYPE * input = numa_alloc((input_size) * sizeof(DTYPE));
+ DTYPE * querys = numa_alloc((n_querys) * sizeof(DTYPE));
+#else
DTYPE * input = malloc((input_size) * sizeof(DTYPE));
DTYPE * querys = malloc((n_querys) * sizeof(DTYPE));
+#endif
+
+#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
DTYPE result_host = -1;
// Create an input file with arbitrary data.
create_test_file(input, input_size, querys, n_querys);
-
+
+#if NUMA
+ mp_pages[0] = input;
+ 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 error: %d", mp_status[0]);
+ }
+ else {
+ numa_node_in = 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
+
start(&timer, 0, 0);
- result_host = binarySearch(input, input_size - 1, querys, n_querys);
+ result_host = binarySearch(input, input_size - 1, querys, n_querys);
stop(&timer, 0);
unsigned int nr_threads = 0;
@@ -100,18 +148,30 @@ uint64_t binarySearch(DTYPE * input, uint64_t input_size, DTYPE* querys, unsigne
int status = (result_host);
if (status) {
- printf("[::] BS CPU | n_threads=%d e_type=%s n_elements=%d "
- "| throughput_MBps=%f",
+ printf("[::] BS CPU | n_threads=%d e_type=%s n_elements=%lu"
+#if NUMA
+ " numa_node_in=%d numa_node_cpu=%d numa_distance_in_cpu=%d"
+#endif
+ " | throughput_MBps=%f",
nr_threads, "uint64_t", input_size,
+#if NUMA
+ numa_node_in, numa_node_cpu, numa_distance(numa_node_in, numa_node_cpu),
+#endif
n_querys * sizeof(DTYPE) / timer.time[0]);
printf(" throughput_MOpps=%f",
- nr_threads, "uint64_t", input_size,
n_querys / timer.time[0]);
printall(&timer, 0);
} else {
printf("[ERROR]\n");
}
+
+#if NUMA
+ numa_free(input, input_size * sizeof(DTYPE));
+ numa_free(querys, n_querys * sizeof(DTYPE));
+#else
free(input);
+ free(querys);
+#endif
return status ? 0 : 1;