2016-11-23 02:03:20 +03:00
|
|
|
/*
|
2018-02-21 19:26:32 +03:00
|
|
|
* Copyright (c) 2013-2018 Mellanox Technologies, Inc.
|
2016-11-23 02:03:20 +03:00
|
|
|
* All rights reserved.
|
|
|
|
* Copyright (c) 2015 Research Organization for Information Science
|
|
|
|
* and Technology (RIST). All rights reserved.
|
|
|
|
* $COPYRIGHT$
|
|
|
|
*
|
|
|
|
* Additional copyrights may follow
|
|
|
|
*
|
|
|
|
* $HEADER$
|
|
|
|
*/
|
|
|
|
#include "oshmem/proc/proc_group_cache.h"
|
|
|
|
#include "oshmem/constants.h"
|
|
|
|
#include "oshmem/runtime/runtime.h"
|
|
|
|
|
2018-02-21 19:26:32 +03:00
|
|
|
#define OSHMEM_GROUP_CACHE_SIZE 1024
|
2016-11-23 02:03:20 +03:00
|
|
|
|
2018-02-21 19:26:32 +03:00
|
|
|
static opal_hash_table_t group_cache;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
int pe_start;
|
|
|
|
int pe_size;
|
|
|
|
int pe_stride;
|
|
|
|
} oshmem_group_key_t;
|
2016-11-23 02:03:20 +03:00
|
|
|
|
2018-02-21 19:26:32 +03:00
|
|
|
static int group_cache_n_hits;
|
|
|
|
static int group_cache_n_lookups;
|
|
|
|
|
|
|
|
int oshmem_group_cache_init(void)
|
2016-11-23 02:03:20 +03:00
|
|
|
{
|
2018-02-21 19:26:32 +03:00
|
|
|
OBJ_CONSTRUCT(&group_cache, opal_hash_table_t);
|
|
|
|
if (OPAL_SUCCESS != opal_hash_table_init(&group_cache, OSHMEM_GROUP_CACHE_SIZE)) {
|
|
|
|
return OSHMEM_ERROR;
|
2016-11-23 02:03:20 +03:00
|
|
|
}
|
|
|
|
return OSHMEM_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2018-02-21 19:26:32 +03:00
|
|
|
void oshmem_group_cache_destroy(void)
|
2016-11-23 02:03:20 +03:00
|
|
|
{
|
2018-02-21 19:26:32 +03:00
|
|
|
OBJ_DESTRUCT(&group_cache);
|
|
|
|
}
|
|
|
|
|
|
|
|
oshmem_group_t *oshmem_group_cache_find(int pe_start, int pe_stride, int pe_size)
|
|
|
|
{
|
|
|
|
oshmem_group_key_t key;
|
|
|
|
oshmem_group_t *group;
|
|
|
|
|
|
|
|
if (!oshmem_group_cache_enabled()) {
|
|
|
|
return NULL;
|
2016-11-23 02:03:20 +03:00
|
|
|
}
|
2018-02-21 19:26:32 +03:00
|
|
|
|
|
|
|
key.pe_start = pe_start;
|
|
|
|
key.pe_size = pe_size;
|
|
|
|
key.pe_stride = pe_stride;
|
|
|
|
|
|
|
|
group_cache_n_lookups++;
|
|
|
|
|
|
|
|
if (OPAL_SUCCESS != opal_hash_table_get_value_ptr(&group_cache, &key,
|
|
|
|
sizeof(key), (void **)&group)) {
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
group_cache_n_hits++;
|
|
|
|
return group;
|
2016-11-23 02:03:20 +03:00
|
|
|
}
|
|
|
|
|
2018-02-21 19:26:32 +03:00
|
|
|
int oshmem_group_cache_insert(oshmem_group_t *group, int pe_start,
|
|
|
|
int pe_stride, int pe_size)
|
2016-11-23 02:03:20 +03:00
|
|
|
{
|
2018-02-21 19:26:32 +03:00
|
|
|
oshmem_group_key_t key;
|
|
|
|
|
|
|
|
if (!oshmem_group_cache_enabled()) {
|
|
|
|
return OSHMEM_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
key.pe_start = pe_start;
|
|
|
|
key.pe_size = pe_size;
|
|
|
|
key.pe_stride = pe_stride;
|
|
|
|
|
|
|
|
if (OPAL_SUCCESS != opal_hash_table_set_value_ptr(&group_cache, &key,
|
|
|
|
sizeof(key), group)) {
|
|
|
|
return OSHMEM_ERROR;
|
2016-11-23 02:03:20 +03:00
|
|
|
}
|
|
|
|
return OSHMEM_SUCCESS;
|
|
|
|
}
|
|
|
|
|