import sys, os, time, random, string import Vmaps Vm = Vmaps # How many iterations of Operate() should be done TotalIters = 1024 * 1024 * 1 # How many children to fork() RunJobs = 3 # how much space (in bytes) to operate in TestSize = 1024 * 8#1024 * 4 # how many columns per array element TCols=32 # What to name the test file (it is deleted when we finish) TestFileName = 'xxVmapdata.xxx' # How many random numbers to generate RandomSample1 = 1024 * 57 RandomSample2 = 1024 * 13 # ------------------------------------------------- def Operate( amap, rndx, cl ): Spun = 0 while 1: dt = amap.atswap(rndx,cl,-1) if dt !=-1: break Spun +=1 amap.schyield() # endw amap.atswap(rndx,cl,dt+1) return Spun # ------------------------------------------------- def Summarize( amap, Workers ): Hlen=len(amap)+1 print len(amap), 'elements in', amap.databytes, 'bytes,', amap.size, 'mapped space' print '----------------- sum retype' amap.astype(8) Mlen = len(amap) - Hlen todo=(TotalIters / Workers) # odd splits will result in "lost" iterations xrnd= ( TotalIters - (todo*Workers) ) print Workers, 'kids with', todo, 'each (',TotalIters,' total', xrnd, 'wksplit)' aa=ba=z=hw=c= 0 avg = (TotalIters/ (Mlen-Hlen)) # one col per element should be 0 spike=time.time() c = amap.sumrange() [mini,maxi] = amap.minmax() hw=amap[maxi] zc=amap.cntbndrange() print ("%8.2f" % (time.time()-spike)), 'sec to summarize' print 'total=',c print 'avg=',avg, print 'highwater=',hw, 'numzero=',zc, print if c != (TotalIters-xrnd): print ' OOOPS!! lost ', (TotalIters - c), 'iterations somewhere' #endif return # ------------------------------------------------- def MakeMap(fd): vm_type = Vm.Int2d vm_cols = TCols vm_flags = Vm.VM_STAYOPEN mm_flags = Vm.MAP_SHARED | Vm.MAP_NORESERVE mm_prot = Vm.PROT_READ | Vm.PROT_WRITE amap = Vm.newmap( fd, TestSize, 0, mm_flags, mm_prot, vm_flags, vm_type, vm_cols ) amap.open() #amap.astype(vm_type, vm_cols) #amap[0]=1 #print 'data:', amap[0],amap[(len(amap)-1)] return amap # ------------------------------------------------- # ------------------------------------------------- # ------------------------------------------------- KidSeedRange= 1024 * 1024 * 1024 KidWaitSleep = 0.1 BlockSize= min(1024 * 512, TestSize) # ------------------------------------------------- def main(): Spinners=Spun=0 Workers = RunJobs TestFile = TestFileName+str(os.getpid()) # init file fo = open(TestFile,'w+') wrote=0 bk=chr(0) * BlockSize while wrote0: print cnt,("%5.2f" % (time.time()-spike)), 'sec; ', sys.stdout.flush() lcnt=cnt # nedif if cnt >= Workers: break time.sleep(KidWaitSleep) # endw print print ("%5.2f" % (time.time()-spike)), 'sec; Go!' sys.stdout.flush() # <------ children are operating; wait for them all to signal done print spike=time.time() while amap[0][0]!=0: time.sleep(KidWaitSleep) # amap.schyield() # <------------------------------------- sync; all kids done now print '---------------------------------- done' print 'wait',("%8.2f" % (time.time()-spike)), 'sec' spike=time.time() amap.raw_msync(Vm.MS_SYNC) print 'sync',("%8.2f" % (time.time()-spike)), 'sec' # signal children we have done msync() amap.atswap(0,0,-2) # <------------------------------------- sync; kids may close and exit # wait for children to exit while len(kids): nk=[] for pid in kids: (rp,st) = os.waitpid(pid,os.WNOHANG) if not rp: nk.append( pid ) # endfor kids=nk # endwhile # summarize amap.atswap(0,0,0) #amap[0] = ([0] * TCols) print 'kwait', ("%8.2f" % (time.time()-spike)), 'sec' # print repr(amap[0:4]) Summarize( amap, Workers ) # cleanup amap.close() fo.close() os.unlink(TestFile) return # ------------------------------------------------- # ------------------------------------------------- # ------------------------------------------------- if '__main__'==__name__: main()