RCCE_lib.h 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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. /* PAD32byte is used to compute a cacheline padded length of n (input) bytes */
  24. #define PAD32byte(n) ((n)%32==0 ? (n) : (n) + 32 - (n)%32)
  25. //#define BITSPERCHAR 8
  26. #define BOTH_IN_COMM_BUFFER 12
  27. #define SOURCE_IN_PRIVATE_MEMORY 34
  28. #define TARGET_IN_PRIVATE_MEMORY 56
  29. #ifdef SINGLEBITFLAGS
  30. #define RCCE_FLAGS_PER_BYTE 8
  31. #else
  32. #define RCCE_FLAGS_PER_BYTE 1
  33. #endif
  34. #define RCCE_FLAGS_PER_LINE (RCCE_LINE_SIZE*RCCE_FLAGS_PER_BYTE)
  35. #define RCCE_SUM_INT (RCCE_SUM+(RCCE_NUM_OPS)*(RCCE_INT))
  36. #define RCCE_SUM_LONG (RCCE_SUM+(RCCE_NUM_OPS)*(RCCE_LONG))
  37. #define RCCE_SUM_FLOAT (RCCE_SUM+(RCCE_NUM_OPS)*(RCCE_FLOAT))
  38. #define RCCE_SUM_DOUBLE (RCCE_SUM+(RCCE_NUM_OPS)*(RCCE_DOUBLE))
  39. #define RCCE_MAX_INT (RCCE_MAX+(RCCE_NUM_OPS)*(RCCE_INT))
  40. #define RCCE_MAX_LONG (RCCE_MAX+(RCCE_NUM_OPS)*(RCCE_LONG))
  41. #define RCCE_MAX_FLOAT (RCCE_MAX+(RCCE_NUM_OPS)*(RCCE_FLOAT))
  42. #define RCCE_MAX_DOUBLE (RCCE_MAX+(RCCE_NUM_OPS)*(RCCE_DOUBLE))
  43. #define RCCE_MIN_INT (RCCE_MIN+(RCCE_NUM_OPS)*(RCCE_INT))
  44. #define RCCE_MIN_LONG (RCCE_MIN+(RCCE_NUM_OPS)*(RCCE_LONG))
  45. #define RCCE_MIN_FLOAT (RCCE_MIN+(RCCE_NUM_OPS)*(RCCE_FLOAT))
  46. #define RCCE_MIN_DOUBLE (RCCE_MIN+(RCCE_NUM_OPS)*(RCCE_DOUBLE))
  47. #define RCCE_PROD_INT (RCCE_PROD+(RCCE_NUM_OPS)*(RCCE_INT))
  48. #define RCCE_PROD_LONG (RCCE_PROD+(RCCE_NUM_OPS)*(RCCE_LONG))
  49. #define RCCE_PROD_FLOAT (RCCE_PROD+(RCCE_NUM_OPS)*(RCCE_FLOAT))
  50. #define RCCE_PROD_DOUBLE (RCCE_PROD+(RCCE_NUM_OPS)*(RCCE_DOUBLE))
  51. #define RCCE_COMM_INITIALIZED 45328976
  52. #define RCCE_COMM_NOT_INITIALIZED -45328976
  53. // auxiliary MPB pointer type
  54. typedef volatile unsigned int* t_vintp;
  55. // Also need dereferenced types
  56. typedef volatile unsigned char t_vchar;
  57. typedef volatile unsigned int t_vint;
  58. typedef struct rcce_block {
  59. t_vcharp space; // pointer to space for data in block
  60. size_t free_size; // actual free space in block (0 or whole block)
  61. struct rcce_block *next; // pointer to next block in circular linked list
  62. } RCCE_BLOCK;
  63. typedef struct rcce_flag_line {
  64. t_vchar flag[RCCE_FLAGS_PER_LINE]; /* array "flag" (in private memory) stores the
  65. allocation status of flags (0 or 1) */
  66. t_vcharp line_address; /* pointer to the line in the MPB containing
  67. actual flag values in locations corresponding
  68. to allocation statuses in array "flag". */
  69. int members;
  70. struct rcce_flag_line *next;
  71. } RCCE_FLAG_LINE;
  72. typedef struct {
  73. RCCE_BLOCK *tail; // "last" block in linked list of blocks
  74. } RCCE_BLOCK_S;
  75. #ifndef GORY
  76. extern RCCE_FLAG RCCE_sent_flag[RCCE_MAXNP];
  77. extern RCCE_FLAG RCCE_ready_flag[RCCE_MAXNP];
  78. extern t_vcharp RCCE_buff_ptr;
  79. extern size_t RCCE_chunk;
  80. extern t_vcharp RCCE_flags_start;
  81. #endif
  82. extern t_vcharp RCCE_comm_buffer[RCCE_MAXNP];
  83. extern int RCCE_NP;
  84. extern int RCCE_BUFF_SIZE;
  85. #ifndef SCC
  86. extern omp_lock_t RCCE_corelock[RCCE_MAXNP];
  87. extern t_vchar RC_comm_buffer[RCCE_MAXNP*RCCE_BUFF_SIZE_MAX];
  88. extern t_vchar RC_shm_buffer[RCCE_SHM_SIZE_MAX];
  89. #endif
  90. extern int RC_MY_COREID;
  91. extern int RC_COREID[RCCE_MAXNP];
  92. extern double RC_REFCLOCKGHZ;
  93. extern int RCCE_IAM;
  94. extern int RCCE_debug_synch;
  95. extern int RCCE_debug_comm;
  96. extern int RCCE_debug_debug;
  97. extern int RCCE_debug_RPC;
  98. extern RCCE_FLAG_LINE RCCE_flags;
  99. #ifdef SINGLEBITFLAGS
  100. RCCE_FLAG_STATUS RCCE_bit_value(t_vcharp, int);
  101. RCCE_FLAG_STATUS RCCE_flip_bit_value(t_vcharp, int);
  102. int RCCE_write_bit_value(t_vcharp, int, RCCE_FLAG_STATUS);
  103. #endif
  104. extern t_vcharp RCCE_fool_write_combine_buffer;
  105. extern int RCCE_comm_init_val;
  106. void RCCE_malloc_init(t_vcharp, size_t);
  107. void RCCE_shmalloc_init(t_vcharp, size_t);
  108. int RCCE_qsort(char *, size_t, size_t, int (*)(const void*, const void*));
  109. int id_compare(const void *, const void *);
  110. int RCCE_probe(RCCE_FLAG);
  111. int RCCE_error_return(int, int);
  112. void RC_cache_invalidate(void);
  113. int RCCE_global_color(int, void *);
  114. t_vcharp RC_COMM_BUFFER_START(int);
  115. #ifndef GORY
  116. t_vcharp RCCE_malloc(size_t);
  117. t_vcharp RCCE_malloc_request(size_t, size_t *);
  118. void RCCE_free(t_vcharp);
  119. int RCCE_put(t_vcharp, t_vcharp, int, int);
  120. int RCCE_get(t_vcharp, t_vcharp, int, int);
  121. int RCCE_put_char(t_vcharp, t_vcharp, int);
  122. int RCCE_get_char(t_vcharp, t_vcharp, int);
  123. int RCCE_wait_until(RCCE_FLAG, RCCE_FLAG_STATUS);
  124. int RCCE_flag_alloc(RCCE_FLAG *);
  125. int RCCE_flag_free(RCCE_FLAG *);
  126. int RCCE_flag_write(RCCE_FLAG *, RCCE_FLAG_STATUS, int);
  127. int RCCE_flag_read(RCCE_FLAG, RCCE_FLAG_STATUS *, int);
  128. #endif
  129. #ifdef _OPENMP
  130. #pragma omp threadprivate (RC_COREID, RC_MY_COREID, RC_REFCLOCKGHZ)
  131. #pragma omp threadprivate (RCCE_comm_buffer)
  132. #pragma omp threadprivate (RCCE_BUFF_SIZE)
  133. #pragma omp threadprivate (RCCE_IAM, RCCE_NP)
  134. #pragma omp threadprivate (RCCE_debug_synch, RCCE_debug_comm, RCCE_debug_debug)
  135. #pragma omp threadprivate (RCCE_flags)
  136. #ifdef SINGLEBITFLAGS
  137. // #pragma omp threadprivate (RCCE_flags, WORDSIZE, LEFTMOSTBIT)
  138. // #pragma omp threadprivate (RCCE_flags)
  139. #else
  140. #pragma omp threadprivate (RCCE_fool_write_combine_buffer)
  141. #endif
  142. #ifndef GORY
  143. #pragma omp threadprivate (RCCE_sent_flag, RCCE_ready_flag)
  144. #pragma omp threadprivate (RCCE_buff_ptr, RCCE_chunk)
  145. #pragma omp threadprivate (RCCE_flags_start)
  146. #endif
  147. #endif
  148. #ifdef SHMADD
  149. unsigned int getCOREID();
  150. unsigned int readTILEID();
  151. unsigned int readLUT(unsigned int);
  152. void writeLUT(unsigned int, unsigned int);
  153. #endif
  154. // Intel compilers have _rdtsc()/__rdtsc() built-in functions
  155. #ifndef __INTEL_COMPILER
  156. static inline long long _rdtsc()
  157. {
  158. register long long TSC __asm__("eax");
  159. __asm__ volatile (".byte 15, 49" : : : "eax", "edx");
  160. return TSC;
  161. }
  162. #endif
  163. #endif