Hello Hui --
I went and read the README to better understand the question, since it's
actually been quite a while since I used the gperftools CPU profiler.
According to the README, the problem has to do with pthread_mutex_lock()
that happen to be in progress when the CPU profiler signal fires.
I would put the ProfilerStart before the forall-stmt and the
ProfilerStop after its body.
The rest of the discussion will be a bit technical, but there's no
avoiding that. Since you're going to try to draw conclusions about
Chapel task behavior by looking at profiling data from the pthreads that
host the tasks, you have to understand something about how that hosting
works in order to be successful.
The issues vary depending on which tasking layer implementation you are
using. Assuming you're using CHPL_TASKS=qthreads, the default, all the
pthreads are created at program startup time. I don't know if the
qthreads library uses pthread_mutex_lock() calls. I suspect that it
does, but perhaps only under certain circumstances. My guess is that
you won't encounter profiler crashes with CHPL_TASKS=qthreads.
One difficulty you might run into with CHPL_TASKS=qthreads is that it
does lightweight Chapel task switching in user space, that is, it can
run more than one Chapel task per pthread (time-multiplexed, basically).
If this happens it will confuse your results. If you want to profile
the Chapel tasks then you need to make sure you don't run more Chapel
tasks in a parallel construct than there are Qthreads worker pthreads to
run them on. By default this will be true, so you should be okay. But
don't set dataParTasksPerLocale greater than its default value, or
you'll get confusing results.
(When I used the gperftools profiler I was doing internal studies of a
different tasking layer, which behaved more or less like qthreads in
that it did lightweight task switching at user level. But I was using
the profiler to study the tasking layer itself, not the Chapel tasks it
was running.)
If you're using CHPL_TASKS=fifo, the pthreads are created as needed.
Specifically, they are created whenever we have tasks queued to run and
no threads to run them on. But once created, they stick around, so if
you run one parallel construct and then another over the same iterator,
typically the second parallel construct will not create more pthreads.
Fifo tasking uses pthread-mutex_lock() quite a bit, so you might have
trouble with this one.
Hope this helps!
greg
On Tue, 20 Oct 2015, Hui Zhang wrote:
Hello, Greg
I'm not sure if I complete follow your explanation. So if I have the
following block of code, where would you put ProfilerStart and
ProfilerStop ?
var arrayA: [1..numMessages] real;
forall msg in 1..numMessages do {
arrayA[msg] = 0.1;
for i in 1..100000 {
CPUheavy(arrayA[msg]);
CPUlight(arrayA[msg]);
}
writeln("Hello, world! (from iteration ", msg, " of ",
numMessages, ") has
arrayA[msg] ",arrayA[msg]);
}
the thread creating calls should appear within the red line, but if I
want to see which function is spending most time among all the threads,
then shall I put ProfStart and ProfStop outside or inside the red line ?
Thanks
On Tue, Oct 20, 2015 at 6:26 PM, Greg Titus <[email protected]> wrote:
I haven't had trouble with it crashing. This might be
because I always
put the start/stop calls in serial code, before or after any
parallel
constructs but not within them. Since parallel constructs
other than
begin-stmts have implicit syncs afterward, and all the
runtime tasking
layers only create threads (if they have to at all) in order
to execute
parallel constructs, this means that the start/stop calls and
the thread
creation calls are well separated.
That's just a hypothesis, but personally I don't recall
having any
trouble with gperftools crashing.
greg
On Tue, 20 Oct 2015, Hui Zhang wrote:
Ah... sorry I missed that.
It works now , thanks !
One more question: from gperftools' README, it
seems like it sometimes
crashes when threads get created, and it
suggested to avoid putting
ProfilerStart and ProfilerStop among the places
where new threads get
forked, but in this way, how can I profile the
multi-threading feature in
Chapel ? How did you normally use it to profile a
Chapel code with
forall/coforall clauses ?
Thanks !
On Tue, Oct 20, 2015 at 6:06 PM, Greg Titus
<[email protected]> wrote:
I think it's complaining about
ProfilerStop(), perhaps that
you need:
void ProfilerStop(void);
to make it a complete prototype by saying
explicitly that it
takes no
arguments?
greg
On Tue, 20 Oct 2015, Hui Zhang wrote:
Hello, Greg
So I create a prof-decls.h and put
these two
lines in it:
int ProfilerStart(const char* fname);
void ProfilerStop();
which I get from the
gperftools/profiler.h
chpl -g myCode.chpl prof-decls.h
-I../include/ -o
myCode -L../lib -ltest
it reports less errors but still this
one:
In file included from
/chpl__header.h:5:0,
from /_main.c:1:
./prof-decls.h:2:1:
error: function
declaration isn’t a
prototype [-Werror=strict-
prototypes]
why the ProfilerStart declaration
isn't the
function prototype ?
Thanks
On Tue, Oct 20, 2015 at 5:07 PM, Greg
Titus
<[email protected]> wrote:
Hello --
I believe you can solve this
problem by
putting C-style
declarations for
ProfilerStart() and
ProfilerStop() in a .h
file
(prof-decls.h, say) and
then adding that .h file to the
chpl
command line:
chpl -g myCode.chpl
prof-decls.h
-I../include/ -o myCode
-L../lib -ltest
(Sorry I didn't yet respond to
your earlier
message. I
needed time to
dig into the cause of the
problem, but had
not found that
time yet.)
greg
On Tue, 20 Oct 2015, Hui Zhang
wrote:
Hello,
I'm trying to use
gperftools to
profile the
Chapel code, but simply
link
the profiler library
doesn't produce
the profile
file, so I need to
explicitly call two
external C
functions within
my Chapel code, here's
what I did:
1. in my chapel module:
extern proc
ProfilerStart(name:
c_string);
**it
suggested me to use
c_string
instead of string
exetern proc
ProfilerStop();
then in proc main, I
called this
two
functions
2. recompile my chapel
program:
chpl -g
myCode.chpl
-I../include/ -o
myCode -L../lib -ltest
But I got this error :
/_main.c:30:0:
/Hui.c: In function
‘chpl_user_main’:
/Hui.c:160:1: error:
implicit
declaration of
function ‘ProfilerStart’
[-Werror=implicit-function-declaration]
/Hui.c:160:1: error:
nested extern
declaration of
‘ProfilerStart’
[-Werror=nested-externs]
/Hui.c:163:1: error:
implicit
declaration of
function ‘ProfilerStop’
[-Werror=implicit-function-declaration]
/Hui.c:163:1: error:
nested extern
declaration of
‘ProfilerStop’
[-Werror=nested-externs]
cc1: all warnings being
treated as
errors
make: ***
[/tmp/chpl-hzhang86-15966.deleteme/experiment.work.funh.tmp]
Error 1
error: compiling
generated source
[mysystem.cpp:43]
Should I just ignore
these warnings ?
but how to
disable this warning as
error option?
Or am I doing it wrong ?
Thanks
--
Best regards
Hui Zhang
--
Best regards
Hui Zhang
--
Best regards
Hui Zhang
--
Best regards
Hui Zhang
------------------------------------------------------------------------------
_______________________________________________
Chapel-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/chapel-developers