|
Packit Service |
7f3b24 |
// SPDX-License-Identifier: BSD-2-Clause
|
|
Packit Service |
7f3b24 |
/* Copyright (C) 2014 - 2020 Intel Corporation. */
|
|
Packit |
345191 |
|
|
Packit |
345191 |
#include <memkind/internal/memkind_hbw.h>
|
|
Packit |
345191 |
#include "allocator_perf_tool/HugePageOrganizer.hpp"
|
|
Packit |
345191 |
|
|
Packit |
345191 |
#include "trial_generator.h"
|
|
Packit |
345191 |
#include "check.h"
|
|
Packit |
345191 |
#include <vector>
|
|
Packit |
345191 |
#include <numa.h>
|
|
Packit |
345191 |
#include <numaif.h>
|
|
Packit Service |
7f3b24 |
#include <unistd.h>
|
|
Packit |
345191 |
|
|
Packit |
345191 |
trial_t TrialGenerator :: create_trial_tuple(alloc_api_t api,
|
|
Packit |
345191 |
size_t size,
|
|
Packit |
345191 |
size_t alignment,
|
|
Packit |
345191 |
int page_size,
|
|
Packit |
345191 |
memkind_t memkind,
|
|
Packit |
345191 |
int free_index)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
trial_t ltrial;
|
|
Packit |
345191 |
ltrial.api = api;
|
|
Packit |
345191 |
ltrial.size = size;
|
|
Packit |
345191 |
ltrial.alignment = alignment;
|
|
Packit |
345191 |
ltrial.page_size = page_size;
|
|
Packit |
345191 |
ltrial.memkind = memkind;
|
|
Packit |
345191 |
ltrial.free_index = free_index;
|
|
Packit |
345191 |
return ltrial;
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void TrialGenerator :: generate_gb (alloc_api_t api, int number_of_gb_pages,
|
|
Packit |
345191 |
memkind_t memkind, alloc_api_t api_free, bool psize_strict, size_t align)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
std::vector<size_t> sizes_to_alloc;
|
|
Packit |
345191 |
//When API = HBW_MEMALIGN_PSIZE: psize is set to HBW_PAGESIZE_1GB_STRICT when allocation is a multiple of 1GB. Otherwise it is set to HBW_PAGESIZE_1GB.
|
|
Packit |
345191 |
for (int i=1; i <= number_of_gb_pages; i++) {
|
|
Packit |
345191 |
if (psize_strict || api!=HBW_MEMALIGN_PSIZE)
|
|
Packit |
345191 |
sizes_to_alloc.push_back(i*GB);
|
|
Packit |
345191 |
else
|
|
Packit |
345191 |
sizes_to_alloc.push_back(i*GB+1);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
int k = 0;
|
|
Packit |
345191 |
trial_vec.clear();
|
|
Packit |
345191 |
|
|
Packit |
345191 |
for (int i = 0; i< (int)sizes_to_alloc.size(); i++) {
|
|
Packit |
345191 |
trial_vec.push_back(create_trial_tuple(api, sizes_to_alloc[i],
|
|
Packit |
345191 |
align, 2*MB,
|
|
Packit |
345191 |
memkind,
|
|
Packit |
345191 |
-1));
|
|
Packit |
345191 |
if (i > 0)
|
|
Packit |
345191 |
k++;
|
|
Packit |
345191 |
trial_vec.push_back(create_trial_tuple(api_free,0,0,0,
|
|
Packit |
345191 |
memkind,
|
|
Packit |
345191 |
k++));
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
int n_random(int i)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
return random() % i;
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void TrialGenerator :: generate_size_2bytes_2KB_2MB(alloc_api_t api)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
size_t size[] = {2, 2*KB, 2*MB};
|
|
Packit |
345191 |
|
|
Packit |
345191 |
int k = 0;
|
|
Packit |
345191 |
trial_vec.clear();
|
|
Packit |
345191 |
for (unsigned int i = 0; i < (int)(sizeof(size)/sizeof(size[0]));
|
|
Packit |
345191 |
i++) {
|
|
Packit |
345191 |
trial_vec.push_back(
|
|
Packit |
345191 |
create_trial_tuple(
|
|
Packit |
345191 |
api,size[i],
|
|
Packit |
345191 |
32,
|
|
Packit Service |
7f3b24 |
sysconf(_SC_PAGESIZE),
|
|
Packit |
345191 |
MEMKIND_HBW,
|
|
Packit |
345191 |
-1
|
|
Packit |
345191 |
)
|
|
Packit |
345191 |
);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
if (i > 0) k++;
|
|
Packit |
345191 |
trial_vec.push_back(create_trial_tuple(HBW_FREE, 0, 0, 0,
|
|
Packit |
345191 |
MEMKIND_HBW, k));
|
|
Packit |
345191 |
k++;
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void TrialGenerator :: print()
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
|
|
Packit |
345191 |
std::vector<trial_t>:: iterator it;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
std::cout <<"*********** Size: "<< trial_vec.size()
|
|
Packit |
345191 |
<<"********\n";
|
|
Packit |
345191 |
std::cout << "SIZE PSIZE ALIGN FREE KIND"<
|
|
Packit |
345191 |
|
|
Packit |
345191 |
for (it = trial_vec.begin();
|
|
Packit |
345191 |
it != trial_vec.end();
|
|
Packit |
345191 |
it++) {
|
|
Packit |
345191 |
std::cout << it->size <<" "
|
|
Packit |
345191 |
<< it->page_size <<" "
|
|
Packit |
345191 |
<< it->alignment <<" "
|
|
Packit |
345191 |
<< it->free_index <<" "
|
|
Packit |
345191 |
<< it->memkind <<" "
|
|
Packit |
345191 |
<
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void TrialGenerator :: run(int num_bandwidth, std::vector<int> &bandwidth)
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
|
|
Packit |
345191 |
int num_trial = trial_vec.size();
|
|
Packit |
345191 |
int i, ret = 0;
|
|
Packit |
345191 |
void **ptr_vec = NULL;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
ptr_vec = (void **) malloc (num_trial *
|
|
Packit |
345191 |
sizeof (void *));
|
|
Packit |
345191 |
if (NULL == ptr_vec) {
|
|
Packit |
345191 |
fprintf (stderr, "Error in allocating ptr array\n");
|
|
Packit |
345191 |
exit(-1);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
for (i = 0; i < num_trial; ++i) {
|
|
Packit |
345191 |
ptr_vec[i] = NULL;
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
for (i = 0; i < num_trial; ++i) {
|
|
Packit |
345191 |
switch(trial_vec[i].api) {
|
|
Packit |
345191 |
case HBW_FREE:
|
|
Packit |
345191 |
if (i == num_trial - 1 || trial_vec[i + 1].api != HBW_REALLOC) {
|
|
Packit |
345191 |
hbw_free(ptr_vec[trial_vec[i].free_index]);
|
|
Packit |
345191 |
ptr_vec[trial_vec[i].free_index] = NULL;
|
|
Packit |
345191 |
ptr_vec[i] = NULL;
|
|
Packit |
345191 |
} else {
|
|
Packit |
345191 |
ptr_vec[i + 1] = hbw_realloc(ptr_vec[trial_vec[i].free_index],
|
|
Packit |
345191 |
trial_vec[i + 1].size);
|
|
Packit |
345191 |
ptr_vec[trial_vec[i].free_index] = NULL;
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
break;
|
|
Packit |
345191 |
case MEMKIND_FREE:
|
|
Packit |
345191 |
if (i == num_trial - 1 || trial_vec[i + 1].api != MEMKIND_REALLOC) {
|
|
Packit |
345191 |
memkind_free(trial_vec[i].memkind,
|
|
Packit |
345191 |
ptr_vec[trial_vec[i].free_index]);
|
|
Packit |
345191 |
ptr_vec[trial_vec[i].free_index] = NULL;
|
|
Packit |
345191 |
ptr_vec[i] = NULL;
|
|
Packit |
345191 |
} else {
|
|
Packit |
345191 |
ptr_vec[i + 1] = memkind_realloc(trial_vec[i].memkind,
|
|
Packit |
345191 |
ptr_vec[trial_vec[i].free_index],
|
|
Packit |
345191 |
trial_vec[i + 1].size);
|
|
Packit |
345191 |
ptr_vec[trial_vec[i].free_index] = NULL;
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
break;
|
|
Packit |
345191 |
case HBW_MALLOC:
|
|
Packit |
345191 |
fprintf (stdout,"Allocating %zd bytes using hbw_malloc\n",
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
ptr_vec[i] = hbw_malloc(trial_vec[i].size);
|
|
Packit |
345191 |
break;
|
|
Packit |
345191 |
case HBW_CALLOC:
|
|
Packit |
345191 |
fprintf (stdout,"Allocating %zd bytes using hbw_calloc\n",
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
ptr_vec[i] = hbw_calloc(trial_vec[i].size, 1);
|
|
Packit |
345191 |
break;
|
|
Packit |
345191 |
case HBW_REALLOC:
|
|
Packit |
345191 |
fprintf (stdout,"Allocating %zd bytes using hbw_realloc\n",
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
fflush(stdout);
|
|
Packit |
345191 |
if (NULL == ptr_vec[i]) {
|
|
Packit |
345191 |
ptr_vec[i] = hbw_realloc(NULL, trial_vec[i].size);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
break;
|
|
Packit |
345191 |
case HBW_MEMALIGN:
|
|
Packit |
345191 |
fprintf (stdout,"Allocating %zd bytes using hbw_memalign\n",
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
ret = hbw_posix_memalign(&ptr_vec[i],
|
|
Packit |
345191 |
trial_vec[i].alignment,
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
break;
|
|
Packit |
345191 |
case HBW_MEMALIGN_PSIZE:
|
|
Packit |
345191 |
fprintf (stdout,"Allocating %zd bytes using hbw_memalign_psize\n",
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
hbw_pagesize_t psize;
|
|
Packit Service |
7f3b24 |
if (trial_vec[i].page_size == (size_t)sysconf(_SC_PAGESIZE))
|
|
Packit |
345191 |
psize = HBW_PAGESIZE_4KB;
|
|
Packit |
345191 |
else if (trial_vec[i].page_size == 2097152)
|
|
Packit |
345191 |
psize = HBW_PAGESIZE_2MB;
|
|
Packit |
345191 |
else if (trial_vec[i].size %
|
|
Packit |
345191 |
trial_vec[i].page_size > 0)
|
|
Packit |
345191 |
psize = HBW_PAGESIZE_1GB;
|
|
Packit |
345191 |
else
|
|
Packit |
345191 |
psize = HBW_PAGESIZE_1GB_STRICT;
|
|
Packit |
345191 |
|
|
Packit |
345191 |
ret = hbw_posix_memalign_psize(&ptr_vec[i],
|
|
Packit |
345191 |
trial_vec[i].alignment,
|
|
Packit |
345191 |
trial_vec[i].size,
|
|
Packit |
345191 |
psize);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
break;
|
|
Packit |
345191 |
case MEMKIND_MALLOC:
|
|
Packit |
345191 |
fprintf (stdout,"Allocating %zd bytes using memkind_malloc\n",
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
ptr_vec[i] = memkind_malloc(trial_vec[i].memkind,
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
break;
|
|
Packit |
345191 |
case MEMKIND_CALLOC:
|
|
Packit |
345191 |
fprintf (stdout,"Allocating %zd bytes using memkind_calloc\n",
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
ptr_vec[i] = memkind_calloc(trial_vec[i].memkind,
|
|
Packit |
345191 |
trial_vec[i].size, 1);
|
|
Packit |
345191 |
break;
|
|
Packit |
345191 |
case MEMKIND_REALLOC:
|
|
Packit |
345191 |
fprintf (stdout,"Allocating %zd bytes using memkind_realloc\n",
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
if (NULL == ptr_vec[i]) {
|
|
Packit |
345191 |
ptr_vec[i] = memkind_realloc(trial_vec[i].memkind,
|
|
Packit |
345191 |
ptr_vec[i],
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
break;
|
|
Packit |
345191 |
case MEMKIND_POSIX_MEMALIGN:
|
|
Packit |
345191 |
fprintf (stdout,
|
|
Packit |
345191 |
"Allocating %zd bytes using memkind_posix_memalign\n",
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
ret = memkind_posix_memalign(trial_vec[i].memkind,
|
|
Packit |
345191 |
&ptr_vec[i],
|
|
Packit |
345191 |
trial_vec[i].alignment,
|
|
Packit |
345191 |
trial_vec[i].size);
|
|
Packit |
345191 |
break;
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
if (trial_vec[i].api != HBW_FREE &&
|
|
Packit |
345191 |
trial_vec[i].api != MEMKIND_FREE &&
|
|
Packit |
345191 |
trial_vec[i].memkind != MEMKIND_DEFAULT) {
|
|
Packit |
345191 |
ASSERT_TRUE(ptr_vec[i] != NULL);
|
|
Packit |
345191 |
memset(ptr_vec[i], 0, trial_vec[i].size);
|
|
Packit |
345191 |
Check check(ptr_vec[i], trial_vec[i]);
|
|
Packit |
345191 |
if (trial_vec[i].api == HBW_CALLOC) {
|
|
Packit |
345191 |
EXPECT_EQ(0, check.check_zero());
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
if (trial_vec[i].api == HBW_MEMALIGN ||
|
|
Packit |
345191 |
trial_vec[i].api == HBW_MEMALIGN_PSIZE ||
|
|
Packit |
345191 |
trial_vec[i].api == MEMKIND_POSIX_MEMALIGN) {
|
|
Packit |
345191 |
EXPECT_EQ(0, check.check_align(trial_vec[i].alignment));
|
|
Packit |
345191 |
EXPECT_EQ(0, ret);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
if (trial_vec[i].api == HBW_MEMALIGN_PSIZE ||
|
|
Packit |
345191 |
(trial_vec[i].api == MEMKIND_MALLOC &&
|
|
Packit |
345191 |
(trial_vec[i].memkind == MEMKIND_HBW_HUGETLB ||
|
|
Packit |
345191 |
trial_vec[i].memkind == MEMKIND_HBW_PREFERRED_HUGETLB))) {
|
|
Packit |
345191 |
EXPECT_EQ(0, check.check_page_size(trial_vec[i].page_size));
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
for (i = 0; i < num_trial; ++i) {
|
|
Packit |
345191 |
if (ptr_vec[i]) {
|
|
Packit |
345191 |
hbw_free(ptr_vec[i]);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void TGTest :: SetUp()
|
|
Packit |
345191 |
{
|
|
Packit |
345191 |
size_t node;
|
|
Packit |
345191 |
char *hbw_nodes_env, *endptr;
|
|
Packit |
345191 |
tgen = std::unique_ptr<TrialGenerator>(new TrialGenerator());
|
|
Packit |
345191 |
|
|
Packit |
345191 |
hbw_nodes_env = secure_getenv("MEMKIND_HBW_NODES");
|
|
Packit |
345191 |
if (hbw_nodes_env) {
|
|
Packit |
345191 |
num_bandwidth = 128;
|
|
Packit |
345191 |
for (node = 0; node < num_bandwidth; node++) {
|
|
Packit |
345191 |
bandwidth.push_back(1);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
node = strtol(hbw_nodes_env, &endptr, 10);
|
|
Packit |
345191 |
bandwidth.push_back(2);
|
|
Packit |
345191 |
while (*endptr == ':') {
|
|
Packit |
345191 |
hbw_nodes_env = endptr + 1;
|
|
Packit |
345191 |
node = strtol(hbw_nodes_env, &endptr, 10);
|
|
Packit Service |
7f3b24 |
if (endptr != hbw_nodes_env && node < num_bandwidth) {
|
|
Packit |
345191 |
bandwidth.push_back(2);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
} else {
|
|
Packit |
345191 |
num_bandwidth = NUMA_NUM_NODES;
|
|
Packit |
345191 |
nodemask_t nodemask;
|
|
Packit |
345191 |
struct bitmask nodemask_bm = {NUMA_NUM_NODES, nodemask.n};
|
|
Packit |
345191 |
numa_bitmask_clearall(&nodemask_bm);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
memkind_hbw_all_get_mbind_nodemask(NULL, nodemask.n, NUMA_NUM_NODES);
|
|
Packit |
345191 |
|
|
Packit |
345191 |
int i, nodes_num = numa_num_configured_nodes();
|
|
Packit |
345191 |
for (i=0; i
|
|
Packit |
345191 |
if (i >= nodes_num) {
|
|
Packit |
345191 |
bandwidth.push_back(0);
|
|
Packit |
345191 |
} else if (numa_bitmask_isbitset(&nodemask_bm, i)) {
|
|
Packit |
345191 |
bandwidth.push_back(2);
|
|
Packit |
345191 |
} else {
|
|
Packit |
345191 |
bandwidth.push_back(1);
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
}
|
|
Packit |
345191 |
|
|
Packit |
345191 |
void TGTest :: TearDown()
|
|
Packit |
345191 |
{}
|