Blame test/trial_generator.cpp

Packit Service 724aca
/*
Packit Service 724aca
 * Copyright (C) 2014 - 2019 Intel Corporation.
Packit Service 724aca
 * All rights reserved.
Packit Service 724aca
 *
Packit Service 724aca
 * Redistribution and use in source and binary forms, with or without
Packit Service 724aca
 * modification, are permitted provided that the following conditions are met:
Packit Service 724aca
 * 1. Redistributions of source code must retain the above copyright notice(s),
Packit Service 724aca
 *    this list of conditions and the following disclaimer.
Packit Service 724aca
 * 2. Redistributions in binary form must reproduce the above copyright notice(s),
Packit Service 724aca
 *    this list of conditions and the following disclaimer in the documentation
Packit Service 724aca
 *    and/or other materials provided with the distribution.
Packit Service 724aca
 *
Packit Service 724aca
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY EXPRESS
Packit Service 724aca
 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
Packit Service 724aca
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO
Packit Service 724aca
 * EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY DIRECT, INDIRECT,
Packit Service 724aca
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service 724aca
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
Packit Service 724aca
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
Packit Service 724aca
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
Packit Service 724aca
 * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
Packit Service 724aca
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service 724aca
 */
Packit Service 724aca
Packit Service 724aca
#include <memkind/internal/memkind_hbw.h>
Packit Service 724aca
#include "allocator_perf_tool/HugePageOrganizer.hpp"
Packit Service 724aca
Packit Service 724aca
#include "trial_generator.h"
Packit Service 724aca
#include "check.h"
Packit Service 724aca
#include <vector>
Packit Service 724aca
#include <numa.h>
Packit Service 724aca
#include <numaif.h>
Packit Service 724aca
Packit Service 724aca
trial_t TrialGenerator :: create_trial_tuple(alloc_api_t api,
Packit Service 724aca
                                             size_t size,
Packit Service 724aca
                                             size_t alignment,
Packit Service 724aca
                                             int page_size,
Packit Service 724aca
                                             memkind_t memkind,
Packit Service 724aca
                                             int free_index)
Packit Service 724aca
{
Packit Service 724aca
    trial_t ltrial;
Packit Service 724aca
    ltrial.api = api;
Packit Service 724aca
    ltrial.size = size;
Packit Service 724aca
    ltrial.alignment = alignment;
Packit Service 724aca
    ltrial.page_size = page_size;
Packit Service 724aca
    ltrial.memkind = memkind;
Packit Service 724aca
    ltrial.free_index = free_index;
Packit Service 724aca
    return ltrial;
Packit Service 724aca
}
Packit Service 724aca
Packit Service 724aca
Packit Service 724aca
void TrialGenerator :: generate_gb (alloc_api_t api, int number_of_gb_pages,
Packit Service 724aca
                                    memkind_t memkind, alloc_api_t api_free, bool psize_strict, size_t align)
Packit Service 724aca
{
Packit Service 724aca
    std::vector<size_t> sizes_to_alloc;
Packit Service 724aca
    //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 Service 724aca
    for (int i=1; i <= number_of_gb_pages; i++) {
Packit Service 724aca
        if (psize_strict || api!=HBW_MEMALIGN_PSIZE)
Packit Service 724aca
            sizes_to_alloc.push_back(i*GB);
Packit Service 724aca
        else
Packit Service 724aca
            sizes_to_alloc.push_back(i*GB+1);
Packit Service 724aca
    }
Packit Service 724aca
    int k = 0;
Packit Service 724aca
    trial_vec.clear();
Packit Service 724aca
Packit Service 724aca
    for (int i = 0; i< (int)sizes_to_alloc.size(); i++) {
Packit Service 724aca
        trial_vec.push_back(create_trial_tuple(api, sizes_to_alloc[i],
Packit Service 724aca
                                               align, 2*MB,
Packit Service 724aca
                                               memkind,
Packit Service 724aca
                                               -1));
Packit Service 724aca
        if (i > 0)
Packit Service 724aca
            k++;
Packit Service 724aca
        trial_vec.push_back(create_trial_tuple(api_free,0,0,0,
Packit Service 724aca
                                               memkind,
Packit Service 724aca
                                               k++));
Packit Service 724aca
    }
Packit Service 724aca
}
Packit Service 724aca
Packit Service 724aca
int n_random(int i)
Packit Service 724aca
{
Packit Service 724aca
    return random() % i;
Packit Service 724aca
}
Packit Service 724aca
Packit Service 724aca
void TrialGenerator :: generate_size_2bytes_2KB_2MB(alloc_api_t api)
Packit Service 724aca
{
Packit Service 724aca
    size_t size[] = {2, 2*KB, 2*MB};
Packit Service 724aca
Packit Service 724aca
    int k = 0;
Packit Service 724aca
    trial_vec.clear();
Packit Service 724aca
    for (unsigned int i = 0; i < (int)(sizeof(size)/sizeof(size[0]));
Packit Service 724aca
         i++) {
Packit Service 724aca
        trial_vec.push_back(
Packit Service 724aca
            create_trial_tuple(
Packit Service 724aca
                api,size[i],
Packit Service 724aca
                32,
Packit Service 724aca
                4096,
Packit Service 724aca
                MEMKIND_HBW,
Packit Service 724aca
                -1
Packit Service 724aca
            )
Packit Service 724aca
        );
Packit Service 724aca
Packit Service 724aca
        if (i > 0) k++;
Packit Service 724aca
        trial_vec.push_back(create_trial_tuple(HBW_FREE, 0, 0, 0,
Packit Service 724aca
                                               MEMKIND_HBW, k));
Packit Service 724aca
        k++;
Packit Service 724aca
    }
Packit Service 724aca
}
Packit Service 724aca
Packit Service 724aca
void TrialGenerator :: print()
Packit Service 724aca
{
Packit Service 724aca
Packit Service 724aca
    std::vector<trial_t>:: iterator it;
Packit Service 724aca
Packit Service 724aca
    std::cout <<"*********** Size: "<< trial_vec.size()
Packit Service 724aca
              <<"********\n";
Packit Service 724aca
    std::cout << "SIZE PSIZE ALIGN FREE KIND"<
Packit Service 724aca
Packit Service 724aca
    for (it = trial_vec.begin();
Packit Service 724aca
         it != trial_vec.end();
Packit Service 724aca
         it++) {
Packit Service 724aca
        std::cout << it->size <<" "
Packit Service 724aca
                  << it->page_size <<" "
Packit Service 724aca
                  << it->alignment <<" "
Packit Service 724aca
                  << it->free_index <<" "
Packit Service 724aca
                  << it->memkind <<" "
Packit Service 724aca
                  <
Packit Service 724aca
    }
Packit Service 724aca
Packit Service 724aca
}
Packit Service 724aca
Packit Service 724aca
Packit Service 724aca
void TrialGenerator :: run(int num_bandwidth, std::vector<int> &bandwidth)
Packit Service 724aca
{
Packit Service 724aca
Packit Service 724aca
    int num_trial = trial_vec.size();
Packit Service 724aca
    int i, ret = 0;
Packit Service 724aca
    void **ptr_vec = NULL;
Packit Service 724aca
Packit Service 724aca
    ptr_vec = (void **) malloc (num_trial *
Packit Service 724aca
                                sizeof (void *));
Packit Service 724aca
    if (NULL == ptr_vec) {
Packit Service 724aca
        fprintf (stderr, "Error in allocating ptr array\n");
Packit Service 724aca
        exit(-1);
Packit Service 724aca
    }
Packit Service 724aca
Packit Service 724aca
    for (i = 0; i < num_trial; ++i) {
Packit Service 724aca
        ptr_vec[i] = NULL;
Packit Service 724aca
    }
Packit Service 724aca
    for (i = 0; i < num_trial; ++i) {
Packit Service 724aca
        switch(trial_vec[i].api) {
Packit Service 724aca
            case HBW_FREE:
Packit Service 724aca
                if (i == num_trial - 1 || trial_vec[i + 1].api != HBW_REALLOC) {
Packit Service 724aca
                    hbw_free(ptr_vec[trial_vec[i].free_index]);
Packit Service 724aca
                    ptr_vec[trial_vec[i].free_index] = NULL;
Packit Service 724aca
                    ptr_vec[i] = NULL;
Packit Service 724aca
                } else {
Packit Service 724aca
                    ptr_vec[i + 1] = hbw_realloc(ptr_vec[trial_vec[i].free_index],
Packit Service 724aca
                                                 trial_vec[i + 1].size);
Packit Service 724aca
                    ptr_vec[trial_vec[i].free_index] = NULL;
Packit Service 724aca
                }
Packit Service 724aca
                break;
Packit Service 724aca
            case MEMKIND_FREE:
Packit Service 724aca
                if (i == num_trial - 1 || trial_vec[i + 1].api != MEMKIND_REALLOC) {
Packit Service 724aca
                    memkind_free(trial_vec[i].memkind,
Packit Service 724aca
                                 ptr_vec[trial_vec[i].free_index]);
Packit Service 724aca
                    ptr_vec[trial_vec[i].free_index] = NULL;
Packit Service 724aca
                    ptr_vec[i] = NULL;
Packit Service 724aca
                } else {
Packit Service 724aca
                    ptr_vec[i + 1] = memkind_realloc(trial_vec[i].memkind,
Packit Service 724aca
                                                     ptr_vec[trial_vec[i].free_index],
Packit Service 724aca
                                                     trial_vec[i + 1].size);
Packit Service 724aca
                    ptr_vec[trial_vec[i].free_index] = NULL;
Packit Service 724aca
                }
Packit Service 724aca
                break;
Packit Service 724aca
            case HBW_MALLOC:
Packit Service 724aca
                fprintf (stdout,"Allocating %zd bytes using hbw_malloc\n",
Packit Service 724aca
                         trial_vec[i].size);
Packit Service 724aca
                ptr_vec[i] = hbw_malloc(trial_vec[i].size);
Packit Service 724aca
                break;
Packit Service 724aca
            case HBW_CALLOC:
Packit Service 724aca
                fprintf (stdout,"Allocating %zd bytes using hbw_calloc\n",
Packit Service 724aca
                         trial_vec[i].size);
Packit Service 724aca
                ptr_vec[i] = hbw_calloc(trial_vec[i].size, 1);
Packit Service 724aca
                break;
Packit Service 724aca
            case HBW_REALLOC:
Packit Service 724aca
                fprintf (stdout,"Allocating %zd bytes using hbw_realloc\n",
Packit Service 724aca
                         trial_vec[i].size);
Packit Service 724aca
                fflush(stdout);
Packit Service 724aca
                if (NULL == ptr_vec[i]) {
Packit Service 724aca
                    ptr_vec[i] = hbw_realloc(NULL, trial_vec[i].size);
Packit Service 724aca
                }
Packit Service 724aca
                break;
Packit Service 724aca
            case HBW_MEMALIGN:
Packit Service 724aca
                fprintf (stdout,"Allocating %zd bytes using hbw_memalign\n",
Packit Service 724aca
                         trial_vec[i].size);
Packit Service 724aca
                ret =  hbw_posix_memalign(&ptr_vec[i],
Packit Service 724aca
                                          trial_vec[i].alignment,
Packit Service 724aca
                                          trial_vec[i].size);
Packit Service 724aca
                break;
Packit Service 724aca
            case HBW_MEMALIGN_PSIZE:
Packit Service 724aca
                fprintf (stdout,"Allocating %zd bytes using hbw_memalign_psize\n",
Packit Service 724aca
                         trial_vec[i].size);
Packit Service 724aca
                hbw_pagesize_t psize;
Packit Service 724aca
                if (trial_vec[i].page_size == 4096)
Packit Service 724aca
                    psize = HBW_PAGESIZE_4KB;
Packit Service 724aca
                else if (trial_vec[i].page_size == 2097152)
Packit Service 724aca
                    psize = HBW_PAGESIZE_2MB;
Packit Service 724aca
                else if (trial_vec[i].size %
Packit Service 724aca
                         trial_vec[i].page_size > 0)
Packit Service 724aca
                    psize = HBW_PAGESIZE_1GB;
Packit Service 724aca
                else
Packit Service 724aca
                    psize = HBW_PAGESIZE_1GB_STRICT;
Packit Service 724aca
Packit Service 724aca
                ret = hbw_posix_memalign_psize(&ptr_vec[i],
Packit Service 724aca
                                               trial_vec[i].alignment,
Packit Service 724aca
                                               trial_vec[i].size,
Packit Service 724aca
                                               psize);
Packit Service 724aca
Packit Service 724aca
                break;
Packit Service 724aca
            case MEMKIND_MALLOC:
Packit Service 724aca
                fprintf (stdout,"Allocating %zd bytes using memkind_malloc\n",
Packit Service 724aca
                         trial_vec[i].size);
Packit Service 724aca
                ptr_vec[i] = memkind_malloc(trial_vec[i].memkind,
Packit Service 724aca
                                            trial_vec[i].size);
Packit Service 724aca
                break;
Packit Service 724aca
            case MEMKIND_CALLOC:
Packit Service 724aca
                fprintf (stdout,"Allocating %zd bytes using memkind_calloc\n",
Packit Service 724aca
                         trial_vec[i].size);
Packit Service 724aca
                ptr_vec[i] = memkind_calloc(trial_vec[i].memkind,
Packit Service 724aca
                                            trial_vec[i].size, 1);
Packit Service 724aca
                break;
Packit Service 724aca
            case MEMKIND_REALLOC:
Packit Service 724aca
                fprintf (stdout,"Allocating %zd bytes using memkind_realloc\n",
Packit Service 724aca
                         trial_vec[i].size);
Packit Service 724aca
                if (NULL == ptr_vec[i]) {
Packit Service 724aca
                    ptr_vec[i] = memkind_realloc(trial_vec[i].memkind,
Packit Service 724aca
                                                 ptr_vec[i],
Packit Service 724aca
                                                 trial_vec[i].size);
Packit Service 724aca
                }
Packit Service 724aca
                break;
Packit Service 724aca
            case MEMKIND_POSIX_MEMALIGN:
Packit Service 724aca
                fprintf (stdout,
Packit Service 724aca
                         "Allocating %zd bytes using memkind_posix_memalign\n",
Packit Service 724aca
                         trial_vec[i].size);
Packit Service 724aca
Packit Service 724aca
                ret = memkind_posix_memalign(trial_vec[i].memkind,
Packit Service 724aca
                                             &ptr_vec[i],
Packit Service 724aca
                                             trial_vec[i].alignment,
Packit Service 724aca
                                             trial_vec[i].size);
Packit Service 724aca
                break;
Packit Service 724aca
        }
Packit Service 724aca
        if (trial_vec[i].api != HBW_FREE &&
Packit Service 724aca
            trial_vec[i].api != MEMKIND_FREE &&
Packit Service 724aca
            trial_vec[i].memkind != MEMKIND_DEFAULT) {
Packit Service 724aca
            ASSERT_TRUE(ptr_vec[i] != NULL);
Packit Service 724aca
            memset(ptr_vec[i], 0, trial_vec[i].size);
Packit Service 724aca
            Check check(ptr_vec[i], trial_vec[i]);
Packit Service 724aca
            if (trial_vec[i].api == HBW_CALLOC) {
Packit Service 724aca
                EXPECT_EQ(0, check.check_zero());
Packit Service 724aca
            }
Packit Service 724aca
            if (trial_vec[i].api == HBW_MEMALIGN ||
Packit Service 724aca
                trial_vec[i].api == HBW_MEMALIGN_PSIZE ||
Packit Service 724aca
                trial_vec[i].api == MEMKIND_POSIX_MEMALIGN) {
Packit Service 724aca
                EXPECT_EQ(0, check.check_align(trial_vec[i].alignment));
Packit Service 724aca
                EXPECT_EQ(0, ret);
Packit Service 724aca
            }
Packit Service 724aca
            if (trial_vec[i].api == HBW_MEMALIGN_PSIZE ||
Packit Service 724aca
                (trial_vec[i].api == MEMKIND_MALLOC &&
Packit Service 724aca
                 (trial_vec[i].memkind == MEMKIND_HBW_HUGETLB ||
Packit Service 724aca
                  trial_vec[i].memkind == MEMKIND_HBW_PREFERRED_HUGETLB))) {
Packit Service 724aca
                EXPECT_EQ(0, check.check_page_size(trial_vec[i].page_size));
Packit Service 724aca
            }
Packit Service 724aca
        }
Packit Service 724aca
    }
Packit Service 724aca
    for (i = 0; i < num_trial; ++i) {
Packit Service 724aca
        if (ptr_vec[i]) {
Packit Service 724aca
            hbw_free(ptr_vec[i]);
Packit Service 724aca
        }
Packit Service 724aca
    }
Packit Service 724aca
}
Packit Service 724aca
Packit Service 724aca
void TGTest :: SetUp()
Packit Service 724aca
{
Packit Service 724aca
    size_t node;
Packit Service 724aca
    char *hbw_nodes_env, *endptr;
Packit Service 724aca
    tgen = std::unique_ptr<TrialGenerator>(new TrialGenerator());
Packit Service 724aca
Packit Service 724aca
    hbw_nodes_env = secure_getenv("MEMKIND_HBW_NODES");
Packit Service 724aca
    if (hbw_nodes_env) {
Packit Service 724aca
        num_bandwidth = 128;
Packit Service 724aca
        for (node = 0; node < num_bandwidth; node++) {
Packit Service 724aca
            bandwidth.push_back(1);
Packit Service 724aca
        }
Packit Service 724aca
        node = strtol(hbw_nodes_env, &endptr, 10);
Packit Service 724aca
        bandwidth.push_back(2);
Packit Service 724aca
        while (*endptr == ':') {
Packit Service 724aca
            hbw_nodes_env = endptr + 1;
Packit Service 724aca
            node = strtol(hbw_nodes_env, &endptr, 10);
Packit Service 724aca
            if (endptr != hbw_nodes_env && node >= 0 && node < num_bandwidth) {
Packit Service 724aca
                bandwidth.push_back(2);
Packit Service 724aca
            }
Packit Service 724aca
        }
Packit Service 724aca
    } else {
Packit Service 724aca
        num_bandwidth = NUMA_NUM_NODES;
Packit Service 724aca
        nodemask_t nodemask;
Packit Service 724aca
        struct bitmask nodemask_bm = {NUMA_NUM_NODES, nodemask.n};
Packit Service 724aca
        numa_bitmask_clearall(&nodemask_bm);
Packit Service 724aca
Packit Service 724aca
        memkind_hbw_all_get_mbind_nodemask(NULL, nodemask.n, NUMA_NUM_NODES);
Packit Service 724aca
Packit Service 724aca
        int i, nodes_num = numa_num_configured_nodes();
Packit Service 724aca
        for (i=0; i
Packit Service 724aca
            if (i >= nodes_num) {
Packit Service 724aca
                bandwidth.push_back(0);
Packit Service 724aca
            } else if (numa_bitmask_isbitset(&nodemask_bm, i)) {
Packit Service 724aca
                bandwidth.push_back(2);
Packit Service 724aca
            } else {
Packit Service 724aca
                bandwidth.push_back(1);
Packit Service 724aca
            }
Packit Service 724aca
        }
Packit Service 724aca
    }
Packit Service 724aca
}
Packit Service 724aca
Packit Service 724aca
void TGTest :: TearDown()
Packit Service 724aca
{}