6b22641669
I know it does not make much sense but one can play around with the performance. Numbers are available at http://www.unixer.de/research/nbcoll/perf/. This is the first step towards collv2. Next step includes the addition of non-blocking functions to the MPI-Layer and the collv1 interface. It implements all MPI-1 collective algorithms in a non-blocking manner. However, the collv1 interface does not allow non-blocking collectives so that all collectives are used blocking by the ompi-glue layer. I wanted to add LibNBC as a separate subdirectory, but I could not convince the buildsystem (and had not the time). So the component looks pretty messy. It would be great if somebody could explain me how to move all nbc*{c,h}, and {hb,dict}*{c,h} to a seperate subdirectory. It's .ompi_ignored because I did not test it exhaustively yet. This commit was SVN r11401.
141 строка
4.6 KiB
C
141 строка
4.6 KiB
C
/*
|
|
* dict.h
|
|
*
|
|
* Interface for generic access to dictionary library.
|
|
* Copyright (C) 2001-2004 Farooq Mela.
|
|
*
|
|
* $Id: dict.h,v 1.6 2001/11/14 05:21:10 farooq Exp farooq $
|
|
*/
|
|
|
|
#ifndef _DICT_H_
|
|
#define _DICT_H_
|
|
|
|
#include <stddef.h>
|
|
|
|
#define DICT_VERSION_MAJOR 0
|
|
#define DICT_VERSION_MINOR 2
|
|
#define DICT_VERSION_PATCH 1
|
|
|
|
#ifndef __P
|
|
# if defined(__STDC__) || defined(__cplusplus) || defined(c_plusplus) || \
|
|
defined(_MSC_VER)
|
|
# define __P(x) x
|
|
# else /* !__STDC__ && !__cplusplus && !c_plusplus && !_MSC_VER */
|
|
# define __P(x)
|
|
# endif
|
|
#endif /* !__P */
|
|
|
|
#ifndef FALSE
|
|
#define FALSE 0
|
|
#endif
|
|
|
|
#ifndef TRUE
|
|
#define TRUE (!FALSE)
|
|
#endif
|
|
|
|
#if defined(__cplusplus) || defined(c_plusplus)
|
|
# define BEGIN_DECL extern "C" {
|
|
# define END_DECL }
|
|
#else
|
|
# define BEGIN_DECL
|
|
# define END_DECL
|
|
#endif
|
|
|
|
BEGIN_DECL
|
|
|
|
typedef void *(*dict_malloc_func)(size_t);
|
|
typedef void (*dict_free_func)(void *);
|
|
|
|
dict_malloc_func dict_set_malloc __P((dict_malloc_func func));
|
|
dict_free_func dict_set_free __P((dict_free_func func));
|
|
|
|
typedef int (*dict_cmp_func) __P((const void *, const void *));
|
|
typedef void (*dict_del_func) __P((void *));
|
|
typedef int (*dict_vis_func) __P((const void *, void *));
|
|
typedef unsigned (*dict_hsh_func) __P((const void *));
|
|
|
|
typedef struct dict dict;
|
|
typedef struct dict_itor dict_itor;
|
|
|
|
struct dict {
|
|
void *_object;
|
|
int (*_insert) __P((void *obj, void *k, void *d, int ow));
|
|
int (*_probe) __P((void *obj, void *key, void **dat));
|
|
void *(*_search) __P((void *obj, const void *k));
|
|
const void *(*_csearch) __P((const void *obj, const void *k));
|
|
int (*_remove) __P((void *obj, const void *key, int del));
|
|
void (*_walk) __P((void *obj, dict_vis_func func));
|
|
unsigned (*_count) __P((const void *obj));
|
|
void (*_empty) __P((void *obj, int del));
|
|
void (*_destroy) __P((void *obj, int del));
|
|
dict_itor *(*_inew) __P((void *obj));
|
|
};
|
|
|
|
#define dict_private(dct) (dct)->_object
|
|
#define dict_insert(dct,k,d,o) (dct)->_insert((dct)->_object, (k), (d), (o))
|
|
#define dict_probe(dct,k,d) (dct)->_probe((dct)->_object, (k), (d))
|
|
#define dict_search(dct,k) (dct)->_search((dct)->_object, (k))
|
|
#define dict_csearch(dct,k) (dct)->_csearch((dct)->_object, (k))
|
|
#define dict_remove(dct,k,del) (dct)->_remove((dct)->_object, (k), (del))
|
|
#define dict_walk(dct,f) (dct)->_walk((dct)->_object, (f))
|
|
#define dict_count(dct) (dct)->_count((dct)->_object)
|
|
#define dict_empty(dct,d) (dct)->_empty((dct)->_object, (d))
|
|
void dict_destroy __P((dict *dct, int del));
|
|
#define dict_itor_new(dct) (dct)->_inew((dct)->_object)
|
|
|
|
struct dict_itor {
|
|
void *_itor;
|
|
int (*_valid) __P((const void *itor));
|
|
void (*_invalid) __P((void *itor));
|
|
int (*_next) __P((void *itor));
|
|
int (*_prev) __P((void *itor));
|
|
int (*_nextn) __P((void *itor, unsigned count));
|
|
int (*_prevn) __P((void *itor, unsigned count));
|
|
int (*_first) __P((void *itor));
|
|
int (*_last) __P((void *itor));
|
|
int (*_search) __P((void *itor, const void *key));
|
|
const void *(*_key) __P((void *itor));
|
|
void *(*_data) __P((void *itor));
|
|
const void *(*_cdata) __P((const void *itor));
|
|
int (*_setdata) __P((void *itor, void *dat, int del));
|
|
int (*_remove) __P((void *itor, int del));
|
|
int (*_compare) __P((void *itor1, void *itor2));
|
|
void (*_destroy) __P((void *itor));
|
|
};
|
|
|
|
#define dict_itor_private(i) (i)->_itor
|
|
#define dict_itor_valid(i) (i)->_valid((i)->_itor)
|
|
#define dict_itor_invalidate(i) (i)->_invalid((i)->_itor)
|
|
#define dict_itor_next(i) (i)->_next((i)->_itor)
|
|
#define dict_itor_prev(i) (i)->_prev((i)->_itor)
|
|
#define dict_itor_nextn(i,n) (i)->_nextn((i)->_itor, (n))
|
|
#define dict_itor_prevn(i,n) (i)->_prevn((i)->_itor, (n))
|
|
#define dict_itor_first(i) (i)->_first((i)->_itor)
|
|
#define dict_itor_last(i) (i)->_last((i)->_itor)
|
|
#define dict_itor_search(i,k) (i)->_search((i)->_itor, (k))
|
|
#define dict_itor_key(i) (i)->_key((i)->_itor)
|
|
#define dict_itor_data(i) (i)->_data((i)->_itor)
|
|
#define dict_itor_cdata(i) (i)->_cdata((i)->_itor)
|
|
#define dict_itor_set_data(i,dat,d) (i)->_setdata((i)->_itor, (dat), (d))
|
|
#define dict_itor_remove(i) (i)->_remove((i)->_itor)
|
|
void dict_itor_destroy __P((dict_itor *itor));
|
|
|
|
int dict_int_cmp __P((const void *k1, const void *k2));
|
|
int dict_uint_cmp __P((const void *k1, const void *k2));
|
|
int dict_long_cmp __P((const void *k1, const void *k2));
|
|
int dict_ulong_cmp __P((const void *k1, const void *k2));
|
|
int dict_ptr_cmp __P((const void *k1, const void *k2));
|
|
int dict_str_cmp __P((const void *k1, const void *k2));
|
|
|
|
END_DECL
|
|
|
|
/*#include "hashtable.h"*/
|
|
#include "hb_tree.h"
|
|
/*#include "pr_tree.h"
|
|
#include "rb_tree.h"
|
|
#include "sp_tree.h"
|
|
#include "tr_tree.h"
|
|
#include "wb_tree.h"*/
|
|
|
|
#endif /* !_DICT_H_ */
|