fxt.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. /*
  2. * StarPU
  3. * Copyright (C) INRIA 2008-2009 (see AUTHORS file)
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU Lesser General Public License as published by
  7. * the Free Software Foundation; either version 2.1 of the License, or (at
  8. * your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful, but
  11. * WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  13. *
  14. * See the GNU Lesser General Public License in COPYING.LGPL for more details.
  15. */
  16. #ifndef __FXT_H__
  17. #define __FXT_H__
  18. #ifndef _GNU_SOURCE
  19. #define _GNU_SOURCE /* ou _BSD_SOURCE ou _SVID_SOURCE */
  20. #endif
  21. #include <unistd.h>
  22. #include <sys/syscall.h> /* pour les définitions de SYS_xxx */
  23. #include <string.h>
  24. #include <sys/types.h>
  25. #include <stdlib.h>
  26. #include <common/config.h>
  27. #include <starpu.h>
  28. /* some key to identify the worker kind */
  29. #define FUT_APPS_KEY 0x100
  30. #define FUT_CORE_KEY 0x101
  31. #define FUT_CUDA_KEY 0x102
  32. #define FUT_WORKER_INIT_START 0x5133
  33. #define FUT_WORKER_INIT_END 0x5134
  34. #define FUT_START_CODELET_BODY 0x5103
  35. #define FUT_END_CODELET_BODY 0x5104
  36. #define FUT_JOB_PUSH 0x5105
  37. #define FUT_JOB_POP 0x5106
  38. #define FUT_START_FETCH_INPUT 0x5107
  39. #define FUT_END_FETCH_INPUT 0x5108
  40. #define FUT_START_PUSH_OUTPUT 0x5109
  41. #define FUT_END_PUSH_OUTPUT 0x5110
  42. #define FUT_CODELET_TAG 0x5111
  43. #define FUT_CODELET_TAG_DEPS 0x5112
  44. #define FUT_DATA_COPY 0x5113
  45. #define FUT_WORK_STEALING 0x5114
  46. #define FUT_WORKER_DEINIT_START 0x5135
  47. #define FUT_WORKER_DEINIT_END 0x5136
  48. #define FUT_USER_DEFINED_START 0x5116
  49. #define FUT_USER_DEFINED_END 0x5117
  50. #define FUT_NEW_MEM_NODE 0x5118
  51. #define FUT_START_CALLBACK 0x5119
  52. #define FUT_END_CALLBACK 0x5120
  53. #define FUT_TASK_DONE 0x5121
  54. #define FUT_START_ALLOC 0x5122
  55. #define FUT_END_ALLOC 0x5123
  56. #define FUT_START_ALLOC_REUSE 0x5128
  57. #define FUT_END_ALLOC_REUSE 0x5129
  58. #define FUT_START_MEMRECLAIM 0x5124
  59. #define FUT_END_MEMRECLAIM 0x5125
  60. #define FUT_START_DRIVER_COPY 0x5126
  61. #define FUT_END_DRIVER_COPY 0x5127
  62. #define FUT_START_PROGRESS 0x5130
  63. #define FUT_END_PROGRESS 0x5131
  64. #define FUT_USER_EVENT 0x5132
  65. #ifdef USE_FXT
  66. #include <fxt/fxt.h>
  67. #include <fxt/fut.h>
  68. void start_fxt_profiling(void);
  69. void fxt_register_thread(unsigned);
  70. /* sometimes we need something a little more specific than the wrappers from
  71. * FxT */
  72. #define FUT_DO_PROBE3STR(CODE, P1, P2, P3, str) \
  73. do { \
  74. /* we add a \0 just in case ... */ \
  75. size_t len = strlen((str)) + 1; \
  76. unsigned nbargs = 3 + (len + sizeof(unsigned long) - 1)/(sizeof(unsigned long));\
  77. size_t total_len = FUT_SIZE(nbargs); \
  78. unsigned long *args = \
  79. fut_getstampedbuffer(FUT_CODE(CODE, nbargs), total_len);\
  80. *(args++) = (unsigned long)(P1); \
  81. *(args++) = (unsigned long)(P2); \
  82. *(args++) = (unsigned long)(P3); \
  83. sprintf((char *)args, "%s", str); \
  84. } while (0);
  85. /* workerkind = FUT_CORE_KEY for instance */
  86. #define TRACE_NEW_MEM_NODE(nodeid) \
  87. FUT_DO_PROBE2(FUT_NEW_MEM_NODE, nodeid, syscall(SYS_gettid));
  88. #define TRACE_WORKER_INIT_START(workerkind,memnode) \
  89. FUT_DO_PROBE3(FUT_WORKER_INIT_START, workerkind, memnode, syscall(SYS_gettid));
  90. #define TRACE_WORKER_INIT_END \
  91. FUT_DO_PROBE1(FUT_WORKER_INIT_END, syscall(SYS_gettid));
  92. #define TRACE_START_CODELET_BODY(job) \
  93. do { \
  94. struct starpu_perfmodel_t *model = (job)->task->cl->model; \
  95. if (model && model->symbol) \
  96. { \
  97. /* we include the symbol name */ \
  98. FUT_DO_PROBE3STR(FUT_START_CODELET_BODY, job, syscall(SYS_gettid), 1, model->symbol);\
  99. } \
  100. else { \
  101. FUT_DO_PROBE3(FUT_START_CODELET_BODY, job, syscall(SYS_gettid), 0);\
  102. } \
  103. } while(0);
  104. #define TRACE_END_CODELET_BODY(job) \
  105. FUT_DO_PROBE2(FUT_END_CODELET_BODY, job, syscall(SYS_gettid));
  106. #define TRACE_START_CALLBACK(job) \
  107. FUT_DO_PROBE2(FUT_START_CALLBACK, job, syscall(SYS_gettid));
  108. #define TRACE_END_CALLBACK(job) \
  109. FUT_DO_PROBE2(FUT_END_CALLBACK, job, syscall(SYS_gettid));
  110. #define TRACE_JOB_PUSH(task, prio) \
  111. FUT_DO_PROBE3(FUT_JOB_PUSH, task, prio, syscall(SYS_gettid));
  112. #define TRACE_JOB_POP(task, prio) \
  113. FUT_DO_PROBE3(FUT_JOB_POP, task, prio, syscall(SYS_gettid));
  114. #define TRACE_START_FETCH_INPUT(job) \
  115. FUT_DO_PROBE2(FUT_START_FETCH_INPUT, job, syscall(SYS_gettid));
  116. #define TRACE_END_FETCH_INPUT(job) \
  117. FUT_DO_PROBE2(FUT_END_FETCH_INPUT, job, syscall(SYS_gettid));
  118. #define TRACE_START_PUSH_OUTPUT(job) \
  119. FUT_DO_PROBE2(FUT_START_PUSH_OUTPUT, job, syscall(SYS_gettid));
  120. #define TRACE_END_PUSH_OUTPUT(job) \
  121. FUT_DO_PROBE2(FUT_END_PUSH_OUTPUT, job, syscall(SYS_gettid));
  122. #define TRACE_CODELET_TAG(tag, job) \
  123. FUT_DO_PROBE2(FUT_CODELET_TAG, tag, job)
  124. #define TRACE_CODELET_TAG_DEPS(tag_child, tag_father) \
  125. FUT_DO_PROBE2(FUT_CODELET_TAG_DEPS, tag_child, tag_father)
  126. #define TRACE_TASK_DONE(tag) \
  127. do { \
  128. struct job_s *job = (tag)->job; \
  129. if (job && job->task \
  130. && job->task->cl \
  131. && job->task->cl->model \
  132. && job->task->cl->model->symbol) \
  133. { \
  134. char *symbol = job->task->cl->model->symbol; \
  135. FUT_DO_PROBE3STR(FUT_TASK_DONE, tag->id, syscall(SYS_gettid), 1, symbol);\
  136. } \
  137. else { \
  138. FUT_DO_PROBE3(FUT_TASK_DONE, tag->id, syscall(SYS_gettid), 0); \
  139. } \
  140. } while(0);
  141. #define TRACE_DATA_COPY(src_node, dst_node, size) \
  142. FUT_DO_PROBE3(FUT_DATA_COPY, src_node, dst_node, size)
  143. #define TRACE_START_DRIVER_COPY(src_node, dst_node, size, com_id) \
  144. FUT_DO_PROBE4(FUT_START_DRIVER_COPY, src_node, dst_node, size, com_id)
  145. #define TRACE_END_DRIVER_COPY(src_node, dst_node, size, com_id) \
  146. FUT_DO_PROBE4(FUT_END_DRIVER_COPY, src_node, dst_node, size, com_id)
  147. #define TRACE_WORK_STEALING(empty_q, victim_q) \
  148. FUT_DO_PROBE2(FUT_WORK_STEALING, empty_q, victim_q)
  149. #define TRACE_WORKER_DEINIT_START \
  150. FUT_DO_PROBE1(FUT_WORKER_DEINIT_START, syscall(SYS_gettid));
  151. #define TRACE_WORKER_DEINIT_END(workerkind) \
  152. FUT_DO_PROBE2(FUT_WORKER_DEINIT_END, workerkind, syscall(SYS_gettid));
  153. #define TRACE_USER_DEFINED_START \
  154. FUT_DO_PROBE1(FUT_USER_DEFINED_START, syscall(SYS_gettid));
  155. #define TRACE_USER_DEFINED_END \
  156. FUT_DO_PROBE1(FUT_USER_DEFINED_END, syscall(SYS_gettid));
  157. #define TRACE_START_ALLOC(memnode) \
  158. FUT_DO_PROBE2(FUT_START_ALLOC, memnode, syscall(SYS_gettid));
  159. #define TRACE_END_ALLOC(memnode) \
  160. FUT_DO_PROBE2(FUT_END_ALLOC, memnode, syscall(SYS_gettid));
  161. #define TRACE_START_ALLOC_REUSE(memnode) \
  162. FUT_DO_PROBE2(FUT_START_ALLOC_REUSE, memnode, syscall(SYS_gettid));
  163. #define TRACE_END_ALLOC_REUSE(memnode) \
  164. FUT_DO_PROBE2(FUT_END_ALLOC_REUSE, memnode, syscall(SYS_gettid));
  165. #define TRACE_START_MEMRECLAIM(memnode) \
  166. FUT_DO_PROBE2(FUT_START_MEMRECLAIM, memnode, syscall(SYS_gettid));
  167. #define TRACE_END_MEMRECLAIM(memnode) \
  168. FUT_DO_PROBE2(FUT_END_MEMRECLAIM, memnode, syscall(SYS_gettid));
  169. #define TRACE_START_PROGRESS(memnode) \
  170. FUT_DO_PROBE2(FUT_START_PROGRESS, memnode, syscall(SYS_gettid));
  171. #define TRACE_END_PROGRESS(memnode) \
  172. FUT_DO_PROBE2(FUT_END_PROGRESS, memnode, syscall(SYS_gettid));
  173. #define TRACE_USER_EVENT(code) \
  174. FUT_DO_PROBE2(FUT_USER_EVENT, code, syscall(SYS_gettid));
  175. #else // !USE_FXT
  176. #define TRACE_NEW_MEM_NODE(nodeid) do {} while(0);
  177. #define TRACE_NEW_WORKER(a,b) do {} while(0);
  178. #define TRACE_WORKER_INIT_START(a,b) do {} while(0);
  179. #define TRACE_WORKER_INIT_END do {} while(0);
  180. #define TRACE_START_CODELET_BODY(job) do {} while(0);
  181. #define TRACE_END_CODELET_BODY(job) do {} while(0);
  182. #define TRACE_START_CALLBACK(job) do {} while(0);
  183. #define TRACE_END_CALLBACK(job) do {} while(0);
  184. #define TRACE_JOB_PUSH(task, prio) do {} while(0);
  185. #define TRACE_JOB_POP(task, prio) do {} while(0);
  186. #define TRACE_START_FETCH_INPUT(job) do {} while(0);
  187. #define TRACE_END_FETCH_INPUT(job) do {} while(0);
  188. #define TRACE_START_PUSH_OUTPUT(job) do {} while(0);
  189. #define TRACE_END_PUSH_OUTPUT(job) do {} while(0);
  190. #define TRACE_CODELET_TAG(tag, job) do {} while(0);
  191. #define TRACE_CODELET_TAG_DEPS(a, b) do {} while(0);
  192. #define TRACE_TASK_DONE(tag) do {} while(0);
  193. #define TRACE_DATA_COPY(a, b, c) do {} while(0);
  194. #define TRACE_START_DRIVER_COPY(a,b,c,d) do {} while(0);
  195. #define TRACE_END_DRIVER_COPY(a,b,c,d) do {} while(0);
  196. #define TRACE_WORK_STEALING(a, b) do {} while(0);
  197. #define TRACE_WORKER_DEINIT_START do {} while(0);
  198. #define TRACE_WORKER_DEINIT_END(a) do {} while(0);
  199. #define TRACE_USER_DEFINED_START do {} while(0);
  200. #define TRACE_USER_DEFINED_END do {} while(0);
  201. #define TRACE_START_ALLOC(memnode) do {} while(0);
  202. #define TRACE_END_ALLOC(memnode) do {} while(0);
  203. #define TRACE_START_ALLOC_REUSE(a) do {} while(0);
  204. #define TRACE_END_ALLOC_REUSE(a) do {} while(0);
  205. #define TRACE_START_MEMRECLAIM(memnode) do {} while(0);
  206. #define TRACE_END_MEMRECLAIM(memnode) do {} while(0);
  207. #define TRACE_START_PROGRESS(memnode) do {} while(0);
  208. #define TRACE_END_PROGRESS(memnode) do {} while(0);
  209. #define TRACE_USER_EVENT(code) do {} while(0);
  210. #endif // USE_FXT
  211. #endif // __FXT_H__