1//
2// Copyright 2010 Intel Corporation
3//
4//    Licensed under the Apache License, Version 2.0 (the "License");
5//    you may not use this file except in compliance with the License.
6//    You may obtain a copy of the License at
7//
8//        http://www.apache.org/licenses/LICENSE-2.0
9//
10//    Unless required by applicable law or agreed to in writing, software
11//    distributed under the License is distributed on an "AS IS" BASIS,
12//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13//    See the License for the specific language governing permissions and
14//    limitations under the License.
15//
16#ifndef RCCE_LIB_H
17#define RCCE_LIB_H
18#include "RCCE.h"
19#ifdef _OPENMP
20  #include <omp.h>
21#endif
22#include <string.h>
23
24/* PAD32byte is used to compute a cacheline padded length of n (input) bytes */
25#define PAD32byte(n) ((n)%32==0 ? (n) : (n) + 32 - (n)%32)
26
27//#define BITSPERCHAR                     8
28
29#define BOTH_IN_COMM_BUFFER             12
30#define SOURCE_IN_PRIVATE_MEMORY        34
31#define TARGET_IN_PRIVATE_MEMORY        56
32
33#define RCCE_SUM_INT                       (RCCE_SUM+(RCCE_NUM_OPS)*(RCCE_INT))
34#define RCCE_SUM_LONG                      (RCCE_SUM+(RCCE_NUM_OPS)*(RCCE_LONG))
35#define RCCE_SUM_FLOAT                     (RCCE_SUM+(RCCE_NUM_OPS)*(RCCE_FLOAT))
36#define RCCE_SUM_DOUBLE                    (RCCE_SUM+(RCCE_NUM_OPS)*(RCCE_DOUBLE))
37#define RCCE_MAX_INT                       (RCCE_MAX+(RCCE_NUM_OPS)*(RCCE_INT))
38#define RCCE_MAX_LONG                      (RCCE_MAX+(RCCE_NUM_OPS)*(RCCE_LONG))
39#define RCCE_MAX_FLOAT                     (RCCE_MAX+(RCCE_NUM_OPS)*(RCCE_FLOAT))
40#define RCCE_MAX_DOUBLE                    (RCCE_MAX+(RCCE_NUM_OPS)*(RCCE_DOUBLE))
41#define RCCE_MIN_INT                       (RCCE_MIN+(RCCE_NUM_OPS)*(RCCE_INT))
42#define RCCE_MIN_LONG                      (RCCE_MIN+(RCCE_NUM_OPS)*(RCCE_LONG))
43#define RCCE_MIN_FLOAT                     (RCCE_MIN+(RCCE_NUM_OPS)*(RCCE_FLOAT))
44#define RCCE_MIN_DOUBLE                    (RCCE_MIN+(RCCE_NUM_OPS)*(RCCE_DOUBLE))
45#define RCCE_PROD_INT                      (RCCE_PROD+(RCCE_NUM_OPS)*(RCCE_INT))
46#define RCCE_PROD_LONG                     (RCCE_PROD+(RCCE_NUM_OPS)*(RCCE_LONG))
47#define RCCE_PROD_FLOAT                    (RCCE_PROD+(RCCE_NUM_OPS)*(RCCE_FLOAT))
48#define RCCE_PROD_DOUBLE                   (RCCE_PROD+(RCCE_NUM_OPS)*(RCCE_DOUBLE))
49
50#define RCCE_COMM_INITIALIZED              45328976
51#define RCCE_COMM_NOT_INITIALIZED          -45328976
52
53// auxiliary MPB pointer type
54typedef volatile unsigned int*  t_vintp;
55// Also need dereferenced types
56typedef volatile unsigned char t_vchar;
57typedef volatile unsigned int  t_vint;
58
59typedef struct rcce_block {
60  t_vcharp space;          // pointer to space for data in block
61  size_t free_size;        // actual free space in block (0 or whole block)
62  struct rcce_block *next; // pointer to next block in circular linked list
63} RCCE_BLOCK;
64
65#ifdef SINGLEBITFLAGS
66typedef struct rcce_flag_line {
67  char flag[RCCE_LINE_SIZE];
68  t_vcharp line_address;
69  int  members;
70  struct rcce_flag_line *next;
71} RCCE_FLAG_LINE;
72#endif
73
74typedef struct  {
75  RCCE_BLOCK *tail;     // "last" block in linked list of blocks
76} RCCE_BLOCK_S;
77
78#ifndef GORY
79  extern RCCE_FLAG    RCCE_sent_flag[RCCE_MAXNP];
80  extern RCCE_FLAG    RCCE_ready_flag[RCCE_MAXNP];
81  extern t_vcharp     RCCE_buff_ptr;
82  extern size_t       RCCE_chunk;
83  extern t_vcharp     RCCE_flags_start;
84#endif
85
86extern t_vcharp     RCCE_comm_buffer[RCCE_MAXNP];
87extern int          RCCE_NP;
88extern int          RCCE_BUFF_SIZE;
89#ifndef COPPERRIDGE
90  extern omp_lock_t RCCE_corelock[RCCE_MAXNP];
91  extern t_vchar    RC_comm_buffer[RCCE_MAXNP*RCCE_BUFF_SIZE_MAX];
92#endif
93extern int          RC_MY_COREID;
94extern int          RC_COREID[RCCE_MAXNP];
95extern double       RC_REFCLOCKGHZ;
96extern int          RCCE_IAM;
97extern int          RCCE_debug_synch;
98extern int          RCCE_debug_comm;
99extern int          RCCE_debug_debug;
100extern int          RCCE_debug_RPC;
101#ifdef SINGLEBITFLAGS
102  extern RCCE_FLAG_LINE RCCE_flags;
103  extern int            WORDSIZE;
104  extern int            LEFTMOSTBIT;
105  RCCE_FLAG_STATUS RCCE_bit_value(t_vcharp, int);
106  RCCE_FLAG_STATUS RCCE_flip_bit_value(t_vcharp, int);
107  int RCCE_write_bit_value(t_vcharp, int, RCCE_FLAG_STATUS);
108#endif
109
110extern int          RCCE_comm_init_val;
111
112void     RCCE_malloc_init(t_vcharp, size_t);
113int      RCCE_qsort(char *, size_t, size_t, int (*)(const void*, const void*));
114int      id_compare(const void *, const void *);
115int      RCCE_probe(RCCE_FLAG);
116int      RCCE_error_return(int, int);
117void     RC_cache_invalidate(void);
118int      RCCE_acquire_lock(int);
119int      RCCE_release_lock(int);
120int      RCCE_global_color(int, void *);
121t_vcharp RC_COMM_BUFFER_START(int);
122
123#ifndef GORY
124  t_vcharp RCCE_malloc(size_t);
125  t_vcharp RCCE_malloc_request(size_t, size_t *);
126  void     RCCE_free(t_vcharp);
127  int      RCCE_put(t_vcharp, t_vcharp, int, int);
128  int      RCCE_get(t_vcharp, t_vcharp, int, int);
129  int      RCCE_wait_until(RCCE_FLAG, RCCE_FLAG_STATUS);
130  int      RCCE_flag_alloc(RCCE_FLAG *);
131  int      RCCE_flag_free(RCCE_FLAG *);
132  int      RCCE_flag_write(RCCE_FLAG *, RCCE_FLAG_STATUS, int);
133  int      RCCE_flag_read(RCCE_FLAG, RCCE_FLAG_STATUS *, int);
134#endif
135
136#ifdef _OPENMP
137  #pragma omp threadprivate (RC_COREID, RC_MY_COREID, RC_REFCLOCKGHZ)
138  #pragma omp threadprivate (RCCE_comm_buffer)
139  #pragma omp threadprivate (RCCE_BUFF_SIZE)
140  #pragma omp threadprivate (RCCE_IAM, RCCE_NP)
141  #pragma omp threadprivate (RCCE_debug_synch, RCCE_debug_comm, RCCE_debug_debug)
142  #ifdef SINGLEBITFLAGS
143    #pragma omp threadprivate (RCCE_flags, WORDSIZE, LEFTMOSTBIT)
144  #endif
145  #ifndef GORY
146    #pragma omp threadprivate (RCCE_sent_flag, RCCE_ready_flag)
147    #pragma omp threadprivate (RCCE_buff_ptr, RCCE_chunk)
148    #pragma omp threadprivate (RCCE_flags_start)
149  #endif
150#endif
151
152#endif
153