1
1
openmpi/oshmem/proc/proc_group_cache.c

87 строки
2.0 KiB
C
Исходник Обычный вид История

/*
* Copyright (c) 2013-2018 Mellanox Technologies, Inc.
* 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"
#define OSHMEM_GROUP_CACHE_SIZE 1024
static opal_hash_table_t group_cache;
typedef struct {
int pe_start;
int pe_size;
int pe_stride;
} oshmem_group_key_t;
static int group_cache_n_hits;
static int group_cache_n_lookups;
int oshmem_group_cache_init(void)
{
OBJ_CONSTRUCT(&group_cache, opal_hash_table_t);
if (OPAL_SUCCESS != opal_hash_table_init(&group_cache, OSHMEM_GROUP_CACHE_SIZE)) {
return OSHMEM_ERROR;
}
return OSHMEM_SUCCESS;
}
void oshmem_group_cache_destroy(void)
{
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;
}
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;
}
int oshmem_group_cache_insert(oshmem_group_t *group, int pe_start,
int pe_stride, int pe_size)
{
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;
}
return OSHMEM_SUCCESS;
}