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