Hi Xtian,
for me it would be much easier if the problem could be reproduced
without multi-core.
According to gdb the crash happens in the practically
empty PrintBuffer::PrintBuffer() constructor.
BTW: Shouldn't it be Xian rather than Xtian?
/// Jürgen
On 03/17/2015 04:57 PM, Christian
Robert wrote:
That
code "only" crash when "traced" with T∆Time.
It work perfectly well (never crash) without the trace.
To me it seams it crash at the "⍎what" statement or when it return
from it's execution.
I will recompile "without" multi-core to see it it's related or
not ...
Xtian.
On 2015-03-17 06:42, Juergen Sauermann wrote:
Hi Xtian,
it looks like you are using the multi-core feature of GNU APL.
As *README-8-parallel* says: *Parallel execution is currently
experimental*.
I have seen core dumps like those earlier when multi-core was
enabled, but have not found the reason.
I suspect a bug in the thread synchronization, but I am not
sure, The code at the point where the crash below occurs
looks rather clean, thats why I believe that some other thread
is involved, corrupting the memory of the other
threads. If you find a bug in the *Parallel.hh* /
*Parallel.**cc* area then please let me know.
You can also use the *workspaces/ScalarBenchmark.apl* workspace
which uses a more precise timing
measurement based on the CPU cycle counter. It also crashes at
times, but not so often.
/// Jürgen
On 03/17/2015 02:33 AM, Christian Robert wrote:
)load Util
SAVED 2015-03-17 -3:23:11 (GMT-4)
∇Time[⎕]∇
∇
[0] z←ncpu Time
what;⎕io;start;stop;old_cpu;max_cpu;SYLGet;SYLSet
[1] ⍝
[2] ⍝ Define 2 utility functions
[3] ⍝
[4] z←⎕FX 'Z←SYLGet what;⎕io;index' '⎕io←1' 'index←((⊂
what)≡¨⎕SYL[;1])/⍳↑⍴⎕SYL' 'Z←⎕SYL[index;2]'
[5] z←⎕FX 'Z←val SYLSet what;⎕io;index' '⎕io←1' 'index←((⊂
what)≡¨⎕SYL[;1])/⍳↑⍴⎕SYL' 'Z←⎕SYL[index;2]←val'
[6] ⍝
[7] ⍝ Monadic or Diadic call ?
[8] ⍝
[9] →(2=⎕NC 'ncpu')/already_set
[10] ncpu←1 ⍝ Set the default
[11] already_set:
[12] ⎕io←0
[13] old_cpu ← SYLGet 'cores used'
[14] max_cpu ← SYLGet 'cores available'
[15] ncpu ← ncpu ⌊ max_cpu ⍝ No more than available ...
[16] ⍝
[17] ⍝ Execute ...
[18] ⍝
[19] z←ncpu SYLSet 'cores used'
[20] start ← ¯5↑⎕ts
[21] ⍎what
[22] stop ← ¯5↑⎕ts
[23] z←old_cpu SYLSet 'cores used'
[24] ⍝
[25] ⍝ Compute execution time
[26] ⍝
[27] →(stop[0]=start[0])/ok ⍝ same day
[28] stop[0]←stop[0]+1 ⍝ day changed
[29] ok:
[30] start ← 32 24 60 60 1000 ⊥ start
[31] stop ← 32 24 60 60 1000 ⊥ stop
[32] z←(⍕(stop-start)÷1000),' seconds at num core =
',(⍕ncpu),' of ', ⍕max_cpu
∇
Fntb 'Time'
z←ncpu Time what;⎕io;start;stop;old_cpu;max_cpu;SYLGet;SYLSet
⍝
⍝ Define 2 utility functions
⍝
z←⎕FX 'Z←SYLGet what;⎕io;index' '⎕io←1' 'index←((⊂
what)≡¨⎕SYL[;1])/⍳↑⍴⎕SYL' 'Z←⎕SYL[index;2]'
z←⎕FX 'Z←val SYLSet what;⎕io;index' '⎕io←1' 'index←((⊂
what)≡¨⎕SYL[;1])/⍳↑⍴⎕SYL' 'Z←⎕SYL[index;2]←val'
⍝
⍝ Monadic or Diadic call ?
⍝
→(2=⎕NC 'ncpu')/already_set
ncpu←1 ⍝ Set the default
already_set:
⎕io←0
old_cpu ← SYLGet 'cores used'
max_cpu ← SYLGet 'cores available'
ncpu ← ncpu ⌊ max_cpu ⍝ No more than available ...
⍝
⍝ Execute ...
⍝
z←ncpu SYLSet 'cores used'
start ← ¯5↑⎕ts
⍎what
stop ← ¯5↑⎕ts
z←old_cpu SYLSet 'cores used'
⍝
⍝ Compute execution time
⍝
→(stop[0]=start[0])/ok ⍝ same day
stop[0]←stop[0]+1 ⍝ day changed
ok:
start ← 32 24 60 60 1000 ⊥ start
stop ← 32 24 60 60 1000 ⊥ stop
z←(⍕(stop-start)÷1000),' seconds at num core = ',(⍕ncpu),' of
', ⍕max_cpu
T∆Time ← ⍳1000
Time 'a←⍳1000000'
Time[4] SYLGet
Time[5] SYLSet
Time[9] →⍬
Time[10] 1
Time[12] 0
Time[13] 1
Time[14] 6
Time[15] 1
Time[19] 1
Time[20] 16 21 28 46 188
Segmentation fault (core dumped)
|