Hi Xtian,
I have done some rework on the memory allocation when printing
large APL values.
Your example semms to work now: SVN 567.
/// Jürgen
On 03/18/2015 01:20 AM, Christian
Robert wrote:
Don't
look further, I've found why it core dump.
If I run it like this:
Time '⊣ z←⍳10000000'
Time[4] SYLGet
Time[5] SYLSet
Time[9] →⍬
Time[10] 1
Time[12] 0
Time[13] 1
Time[14] 1
Time[15] 1
Time[19] 1
Time[20] 17 20 16 13 680
Time[21] 0
Time[22] 17 20 16 13 883
Time[23] 1
Time[27] →29
Time[30] 1541773680
Time[31] 1541773883
Time[32] 0.203 seconds at num core = 1 of 1
0.203 seconds at num core = 1 of 1
it run fine. The problem was that it wanted to display the
resulting 10,000,000 integers
to the display and that probably exhausted my memory while
formatting the resulting buffer ...
May be you can try {} catch {} thoses out-of-memory "new"
allocation ? May be not.
Xtian.
On 2015-03-17 12:51, Juergen Sauermann wrote:
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
P*rintBuffer::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)
|