Objet : Developers list for StarPU
Archives de la liste
- From: Cyril Roelandt <cyril.roelandt@inria.fr>
- To: starpu-devel@lists.gforge.inria.fr
- Subject: [Starpu-devel] Make the FxT-related code portable.
- Date: Tue, 24 Apr 2012 14:27:50 +0200
- List-archive: <http://lists.gforge.inria.fr/pipermail/starpu-devel>
- List-id: "Developers list. For discussion of new features, code changes, etc." <starpu-devel.lists.gforge.inria.fr>
Hi,
On what systems have we tested StarPU with FxT ? Ludovic recently added a "with_fxt" profile on hydra, and it seems to only work on Linux and Darwin. It fails on FreeBSD and GNU, and I have no idea what it does on Windows.
The attached patch should fix the build on FreeBSD. I haven't tested the MPI part, but it should be fine. I can see very nice generated traces on both FreeBSD and Linux. The thing is, I'm not sure it __really__ works on Darwin: it is weird that they have a gettid syscall (cf. http://elliotth.blogspot.fr/2012/04/gettid-on-mac-os.html).
Do we have a Darwin machine to test this ? And how about a Windows machine ?
Cyril.
diff --git a/trunk/mpi/starpu_mpi_fxt.h b/trunk/mpi/starpu_mpi_fxt.h index fc2ff48..c3b60ef 100644 --- a/trunk/mpi/starpu_mpi_fxt.h +++ b/trunk/mpi/starpu_mpi_fxt.h @@ -28,11 +28,11 @@ #ifdef STARPU_USE_FXT #define TRACE_MPI_BARRIER(rank, worldsize, key) \ - FUT_DO_PROBE4(FUT_MPI_BARRIER, (rank), (worldsize), (key), syscall(SYS_gettid)); + FUT_DO_PROBE4(FUT_MPI_BARRIER, (rank), (worldsize), (key), _starpu_gettid()); #define TRACE_MPI_ISEND(dest, mpi_tag, size) \ - FUT_DO_PROBE4(FUT_MPI_ISEND, (dest), (mpi_tag), (size), syscall(SYS_gettid)); + FUT_DO_PROBE4(FUT_MPI_ISEND, (dest), (mpi_tag), (size), _starpu_gettid()); #define TRACE_MPI_IRECV_END(src, mpi_tag) \ - FUT_DO_PROBE3(FUT_MPI_IRECV_END, (src), (mpi_tag), syscall(SYS_gettid)); + FUT_DO_PROBE3(FUT_MPI_IRECV_END, (src), (mpi_tag), _starpu_gettid()); #define TRACE #else #define TRACE_MPI_BARRIER(a, b, c) do {} while(0); diff --git a/trunk/src/common/fxt.c b/trunk/src/common/fxt.c index 3fb61c9..6b61f9c 100644 --- a/trunk/src/common/fxt.c +++ b/trunk/src/common/fxt.c @@ -38,6 +38,24 @@ static int _starpu_written = 0; static int _starpu_id; +#if defined(__linux__) || defined(__APPLE__) +#include <sys/syscall.h> +#elif defined(__FreeBSD__) +#include <sys/thr.h> +#endif +long _starpu_gettid() +{ +#if defined(__linux__) || defined (__APPLE__) + return syscall(SYS_gettid); +#elif defined(__FreeBSD__) + long ltid; + thr_self(<id); + return ltid; +#else +#error "Unknown operating system." +#endif +} + static void _starpu_profile_set_tracefile(void *last, ...) { va_list vl; @@ -78,7 +96,7 @@ void _starpu_start_fxt_profiling(void) _starpu_profile_set_tracefile(NULL); } - threadid = syscall(SYS_gettid); + threadid = _starpu_gettid(); atexit(_starpu_stop_fxt_profiling); @@ -140,7 +158,7 @@ void _starpu_stop_fxt_profiling(void) void _starpu_fxt_register_thread(unsigned cpuid) { - FUT_DO_PROBE2(FUT_NEW_LWP_CODE, cpuid, syscall(SYS_gettid)); + FUT_DO_PROBE2(FUT_NEW_LWP_CODE, cpuid, _starpu_gettid()); } #endif // STARPU_USE_FXT diff --git a/trunk/src/common/fxt.h b/trunk/src/common/fxt.h index b836186..8f84861 100644 --- a/trunk/src/common/fxt.h +++ b/trunk/src/common/fxt.h @@ -103,10 +103,11 @@ #define _STARPU_FUT_TASK_WAIT_FOR_ALL 0x513b #ifdef STARPU_USE_FXT -#include <sys/syscall.h> /* pour les définitions de SYS_xxx */ #include <fxt/fxt.h> #include <fxt/fut.h> +long _starpu_gettid(void); + /* Initialize the FxT library. */ void _starpu_start_fxt_profiling(void); @@ -178,13 +179,13 @@ do { \ /* workerkind = _STARPU_FUT_CPU_KEY for instance */ #define _STARPU_TRACE_NEW_MEM_NODE(nodeid) \ - FUT_DO_PROBE2(_STARPU_FUT_NEW_MEM_NODE, nodeid, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_NEW_MEM_NODE, nodeid, _starpu_gettid()); #define _STARPU_TRACE_WORKER_INIT_START(workerkind, devid, memnode) \ - FUT_DO_PROBE4(_STARPU_FUT_WORKER_INIT_START, workerkind, devid, memnode, syscall(SYS_gettid)); + FUT_DO_PROBE4(_STARPU_FUT_WORKER_INIT_START, workerkind, devid, memnode, _starpu_gettid()); #define _STARPU_TRACE_WORKER_INIT_END \ - FUT_DO_PROBE1(_STARPU_FUT_WORKER_INIT_END, syscall(SYS_gettid)); + FUT_DO_PROBE1(_STARPU_FUT_WORKER_INIT_END, _starpu_gettid()); #define _STARPU_TRACE_START_CODELET_BODY(job) \ do { \ @@ -192,10 +193,10 @@ do { \ if (model_name) \ { \ /* we include the symbol name */ \ - _STARPU_FUT_DO_PROBE3STR(_STARPU_FUT_START_CODELET_BODY, (job), syscall(SYS_gettid), 1, model_name); \ + _STARPU_FUT_DO_PROBE3STR(_STARPU_FUT_START_CODELET_BODY, (job), _starpu_gettid(), 1, model_name); \ } \ else { \ - FUT_DO_PROBE3(_STARPU_FUT_START_CODELET_BODY, (job), syscall(SYS_gettid), 0); \ + FUT_DO_PROBE3(_STARPU_FUT_START_CODELET_BODY, (job), _starpu_gettid(), 0); \ } \ } while(0); @@ -203,35 +204,35 @@ do { \ do { \ const size_t job_size = _starpu_job_get_data_size((job)->task->cl?(job)->task->cl->model:NULL, archtype, nimpl, (job)); \ const uint32_t job_hash = _starpu_compute_buffers_footprint((job)->task->cl?(job)->task->cl->model:NULL, archtype, nimpl, (job));\ - FUT_DO_PROBE5(_STARPU_FUT_END_CODELET_BODY, (job), (job_size), (job_hash), (archtype), syscall(SYS_gettid)); \ + FUT_DO_PROBE5(_STARPU_FUT_END_CODELET_BODY, (job), (job_size), (job_hash), (archtype), _starpu_gettid()); \ } while(0); #define _STARPU_TRACE_START_CALLBACK(job) \ - FUT_DO_PROBE2(_STARPU_FUT_START_CALLBACK, job, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_START_CALLBACK, job, _starpu_gettid()); #define _STARPU_TRACE_END_CALLBACK(job) \ - FUT_DO_PROBE2(_STARPU_FUT_END_CALLBACK, job, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_END_CALLBACK, job, _starpu_gettid()); #define _STARPU_TRACE_JOB_PUSH(task, prio) \ - FUT_DO_PROBE3(_STARPU_FUT_JOB_PUSH, task, prio, syscall(SYS_gettid)); + FUT_DO_PROBE3(_STARPU_FUT_JOB_PUSH, task, prio, _starpu_gettid()); #define _STARPU_TRACE_JOB_POP(task, prio) \ - FUT_DO_PROBE3(_STARPU_FUT_JOB_POP, task, prio, syscall(SYS_gettid)); + FUT_DO_PROBE3(_STARPU_FUT_JOB_POP, task, prio, _starpu_gettid()); #define _STARPU_TRACE_UPDATE_TASK_CNT(counter) \ - FUT_DO_PROBE2(_STARPU_FUT_UPDATE_TASK_CNT, counter, syscall(SYS_gettid)) + FUT_DO_PROBE2(_STARPU_FUT_UPDATE_TASK_CNT, counter, _starpu_gettid()) #define _STARPU_TRACE_START_FETCH_INPUT(job) \ - FUT_DO_PROBE2(_STARPU_FUT_START_FETCH_INPUT, job, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_START_FETCH_INPUT, job, _starpu_gettid()); #define _STARPU_TRACE_END_FETCH_INPUT(job) \ - FUT_DO_PROBE2(_STARPU_FUT_END_FETCH_INPUT, job, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_END_FETCH_INPUT, job, _starpu_gettid()); #define _STARPU_TRACE_START_PUSH_OUTPUT(job) \ - FUT_DO_PROBE2(_STARPU_FUT_START_PUSH_OUTPUT, job, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_START_PUSH_OUTPUT, job, _starpu_gettid()); #define _STARPU_TRACE_END_PUSH_OUTPUT(job) \ - FUT_DO_PROBE2(_STARPU_FUT_END_PUSH_OUTPUT, job, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_END_PUSH_OUTPUT, job, _starpu_gettid()); #define _STARPU_TRACE_TAG(tag, job) \ FUT_DO_PROBE2(_STARPU_FUT_TAG, tag, (job)->job_id) @@ -251,10 +252,10 @@ do { \ const char *model_name = _starpu_get_model_name((job)); \ if (model_name) \ { \ - _STARPU_FUT_DO_PROBE4STR(_STARPU_FUT_TASK_DONE, (job)->job_id, syscall(SYS_gettid), (long unsigned)exclude_from_dag, 1, model_name);\ + _STARPU_FUT_DO_PROBE4STR(_STARPU_FUT_TASK_DONE, (job)->job_id, _starpu_gettid(), (long unsigned)exclude_from_dag, 1, model_name);\ } \ else { \ - FUT_DO_PROBE4(_STARPU_FUT_TASK_DONE, (job)->job_id, syscall(SYS_gettid), (long unsigned)exclude_from_dag, 0);\ + FUT_DO_PROBE4(_STARPU_FUT_TASK_DONE, (job)->job_id, _starpu_gettid(), (long unsigned)exclude_from_dag, 0);\ } \ } while(0); @@ -264,10 +265,10 @@ do { \ const char *model_name = _starpu_get_model_name((job)); \ if (model_name) \ { \ - _STARPU_FUT_DO_PROBE3STR(_STARPU_FUT_TAG_DONE, (tag)->id, syscall(SYS_gettid), 1, model_name); \ + _STARPU_FUT_DO_PROBE3STR(_STARPU_FUT_TAG_DONE, (tag)->id, _starpu_gettid(), 1, model_name); \ } \ else { \ - FUT_DO_PROBE3(_STARPU_FUT_TAG_DONE, (tag)->id, syscall(SYS_gettid), 0);\ + FUT_DO_PROBE3(_STARPU_FUT_TAG_DONE, (tag)->id, _starpu_gettid(), 0);\ } \ } while(0); @@ -290,56 +291,56 @@ do { \ FUT_DO_PROBE2(_STARPU_FUT_WORK_STEALING, empty_q, victim_q) #define _STARPU_TRACE_WORKER_DEINIT_START \ - FUT_DO_PROBE1(_STARPU_FUT_WORKER_DEINIT_START, syscall(SYS_gettid)); + FUT_DO_PROBE1(_STARPU_FUT_WORKER_DEINIT_START, _starpu_gettid()); #define _STARPU_TRACE_WORKER_DEINIT_END(workerkind) \ - FUT_DO_PROBE2(_STARPU_FUT_WORKER_DEINIT_END, workerkind, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_WORKER_DEINIT_END, workerkind, _starpu_gettid()); #define _STARPU_TRACE_WORKER_SLEEP_START \ - FUT_DO_PROBE1(_STARPU_FUT_WORKER_SLEEP_START, syscall(SYS_gettid)); + FUT_DO_PROBE1(_STARPU_FUT_WORKER_SLEEP_START, _starpu_gettid()); #define _STARPU_TRACE_WORKER_SLEEP_END \ - FUT_DO_PROBE1(_STARPU_FUT_WORKER_SLEEP_END, syscall(SYS_gettid)); + FUT_DO_PROBE1(_STARPU_FUT_WORKER_SLEEP_END, _starpu_gettid()); #define _STARPU_TRACE_USER_DEFINED_START \ - FUT_DO_PROBE1(_STARPU_FUT_USER_DEFINED_START, syscall(SYS_gettid)); + FUT_DO_PROBE1(_STARPU_FUT_USER_DEFINED_START, _starpu_gettid()); #define _STARPU_TRACE_USER_DEFINED_END \ - FUT_DO_PROBE1(_STARPU_FUT_USER_DEFINED_END, syscall(SYS_gettid)); + FUT_DO_PROBE1(_STARPU_FUT_USER_DEFINED_END, _starpu_gettid()); #define _STARPU_TRACE_START_ALLOC(memnode) \ - FUT_DO_PROBE2(_STARPU_FUT_START_ALLOC, memnode, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_START_ALLOC, memnode, _starpu_gettid()); #define _STARPU_TRACE_END_ALLOC(memnode) \ - FUT_DO_PROBE2(_STARPU_FUT_END_ALLOC, memnode, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_END_ALLOC, memnode, _starpu_gettid()); #define _STARPU_TRACE_START_ALLOC_REUSE(memnode) \ - FUT_DO_PROBE2(_STARPU_FUT_START_ALLOC_REUSE, memnode, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_START_ALLOC_REUSE, memnode, _starpu_gettid()); #define _STARPU_TRACE_END_ALLOC_REUSE(memnode) \ - FUT_DO_PROBE2(_STARPU_FUT_END_ALLOC_REUSE, memnode, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_END_ALLOC_REUSE, memnode, _starpu_gettid()); #define _STARPU_TRACE_START_MEMRECLAIM(memnode) \ - FUT_DO_PROBE2(_STARPU_FUT_START_MEMRECLAIM, memnode, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_START_MEMRECLAIM, memnode, _starpu_gettid()); #define _STARPU_TRACE_END_MEMRECLAIM(memnode) \ - FUT_DO_PROBE2(_STARPU_FUT_END_MEMRECLAIM, memnode, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_END_MEMRECLAIM, memnode, _starpu_gettid()); /* We skip these events becasue they are called so often that they cause FxT to * fail and make the overall trace unreadable anyway. */ #define _STARPU_TRACE_START_PROGRESS(memnode) \ do {} while (0); -// FUT_DO_PROBE2(_STARPU_FUT_START_PROGRESS, memnode, syscall(SYS_gettid)); +// FUT_DO_PROBE2(_STARPU_FUT_START_PROGRESS, memnode, _starpu_gettid()); #define _STARPU_TRACE_END_PROGRESS(memnode) \ do {} while (0); - //FUT_DO_PROBE2(_STARPU_FUT_END_PROGRESS, memnode, syscall(SYS_gettid)); + //FUT_DO_PROBE2(_STARPU_FUT_END_PROGRESS, memnode, _starpu_gettid()); #define _STARPU_TRACE_USER_EVENT(code) \ - FUT_DO_PROBE2(_STARPU_FUT_USER_EVENT, code, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_USER_EVENT, code, _starpu_gettid()); #define _STARPU_TRACE_SET_PROFILING(status) \ - FUT_DO_PROBE2(_STARPU_FUT_SET_PROFILING, status, syscall(SYS_gettid)); + FUT_DO_PROBE2(_STARPU_FUT_SET_PROFILING, status, _starpu_gettid()); #define _STARPU_TRACE_TASK_WAIT_FOR_ALL \ FUT_DO_PROBE0(_STARPU_FUT_TASK_WAIT_FOR_ALL)
- [Starpu-devel] Make the FxT-related code portable., Cyril Roelandt, 24/04/2012
- <Suite(s) possible(s)>
- Re: [Starpu-devel] Make the FxT-related code portable., Samuel Thibault, 24/04/2012
- Re: [Starpu-devel] Make the FxT-related code portable., Cyril Roelandt, 25/04/2012
- Re: [Starpu-devel] Make the FxT-related code portable., Samuel Thibault, 25/04/2012
- Re: [Starpu-devel] Make the FxT-related code portable., Cyril Roelandt, 25/04/2012
Archives gérées par MHonArc 2.6.19+.