Hi -
I'm using an older version of Parrot (0.2.2) so I can use threads.
It seems that Parrot on Solaris doesn't ever use more than one processor.
The program attached should create argv[1] number of threads, and
divide up over both of them argv[2] - ie perfect linear speedup.
I've got a dual-processor Xeon (a real one, not this hyperthreaded stuff)
and I indeed get speedup:
tonic(19)% time ./parrot /common/tmp/jon/thread_test.pir 1 500000000
<...>
18.870u 0.010s 0:18.93 99.7% 0+0k 0+0io 534pf+0w
tonic(20)% time ./parrot /common/tmp/jon/thread_test.pir 2 500000000
<...>
19.360u 0.030s 0:09.93 195.2% 0+0k 0+0io 534pf+0w
tonic(21)%
However, on a Solaris machine that has 8 CPUs, we get no speedup:
pinot(6)% time ./parrot-solaris /common/tmp/jon/thread_test.pir 1 50000000
<...>
9.69u 0.05s 0:09.77 99.6%
pinot(7)% time ./parrot-solaris /common/tmp/jon/thread_test.pir 2 50000000
<...>
9.08u 0.09s 0:09.19 99.7%
pinot(8)% time ./parrot-solaris /common/tmp/jon/thread_test.pir 4 50000000
<...>
9.28u 0.07s 0:09.38 99.6%
pinot(9)% time ./parrot-solaris /common/tmp/jon/thread_test.pir 8 50000000
<...>
9.67u 0.03s 0:09.74 99.5%
Is there some way we can check to see if Parrot is actually creating more than
one thread? Is it some sort of crazy green-thread issue?
Thanks,
-Erik
# Basic shared array program for parrot
.sub _main
.param pmc argv
.sym int threadIncs
.sym pmc threads
.sym pmc child
.sym pmc Inc_array
.local pmc increment_pass
.local pmc seed_param
.local int i, value, seed
.local pmc temp
.local int tmp
.local int offset
.local int numThreads
.local pmc logtmlib
.local pmc DoBreakpoint
.local string parameter
parameter = shift argv
parameter = shift argv
numThreads = parameter
parameter = shift argv
#numThreads = 1
threadIncs = parameter
threadIncs = threadIncs/numThreads
init_array:
Inc_array = global "increment_array" # get function pointer
# setup an array to hold threads
threads = new .FixedPMCArray
threads = 50
# Set the number of increments to do in each thread
increment_pass = new .Integer
increment_pass = threadIncs
seed = 54433
seed_param = new .Integer
i = 0
create_Thread:
child = new ParrotThread # basically new thread
.sym pmc New_thread
find_method New_thread, child, "thread3"
seed_param = seed
increment_pass = increment_pass
.pcc_begin
.arg Inc_array
.arg increment_pass
.arg seed_param
.invocant child
.nci_call New_thread
.pcc_end
threads[i] = child
inc i
if i < numThreads goto create_Thread
i = 0
# Join and wait on threads
_join_thread:
.sym int tid
.sym pmc Thread_join
child = threads[i]
tid = threads[i]
find_method Thread_join, child, "join"
.pcc_begin
.arg tid
.nci_call Thread_join
.pcc_end
threads[i] = child
inc i
if i < numThreads goto _join_thread
#DoBreakpoint()
i = 0
tmp = 0
_main_print_loop:
tmp = tmp + value
print value
print " "
inc i
if i < 100 goto _main_print_loop
print "\n"
print tmp
print "\n"
.end
# The code to exectute in the thread
.sub increment_array
.param pmc sub
.param pmc increments
.param pmc seed_param
.local int i, tmp, value, numIncs, rand, index
.local int temp
numIncs = increments
i = 0
s_loop:
inc i
if i < numIncs goto s_loop
i = 0
.end