I have a system that repeatedly switching back and forth between core
types; I am trying to evaluate the effects on the caches due to switching.
I give each core its own L1 caches and when switching out, it keeps its L1s
connected. However, when I upgraded to the latest repo that uses simple
DRAM. For some reason the configuration is causing the physmem to never
signal drain. Instead, while draining it just continually refreshed. The
caches and all other objects needing to drain signal drain properly. Here
is a DRAM and Drain trace right before it first attempts to drain:

38190278001: system.physmem: Access time is 18001
38190278001: system.physmem: Reached scheduleNextReq()
38190278001: system.physmem: chooseNextReq(): Returning False
38190296001: system.physmem: processRespondEvent(): Some req has reached
its readyTime
38190296001: system.physmem: Responding to Address 11166592.. 38190296001:
system.physmem: Done
38190297500: system.physmem: Inside recvTimingReq: request Writeback addr
11133824 size 64
38190297500: system.physmem: Write queue limit 32 current size 9
38190297500: system.physmem: Address: 11133824 Rank 1 Bank 6 Row 169
38190297500: system.physmem: Adding to write queue
38190297500: system.physmem: Responding to Address 11133824.. 38190297500:
system.physmem: Done
38190382000: system.physmem: Inside recvTimingReq: request ReadExReq addr
11166656 size 64
38190382000: system.physmem: Read queue limit 32 current size 0
38190382000: system.physmem: Address: 11166656 Rank 0 Bank 6 Row 170
38190382000: system.physmem: Adding to read queue
38190382000: system.physmem: Request <extra arg>%ld - need to schedule
immediately38190382001: system.physmem: Reached scheduleNextReq()
38190382001: system.physmem: Timing access to addr 11166656, rank/bank/row
0 6 170
38190382001: system.physmem: Returning 14000 from estimateLatency()
38190382001: system.physmem: Req 11166656: curtick is 38190382001 accessLat
is 14000 readytime is 38190400001 busbusyuntil is 38190296001. Scheduling
at readyTime
38190382001: system.physmem: Access time is 18001
38190382001: system.physmem: Reached scheduleNextReq()
38190382001: system.physmem: chooseNextReq(): Returning False
38190400001: system.physmem: processRespondEvent(): Some req has reached
its readyTime
38190400001: system.physmem: Responding to Address 11166656.. 38190400001:
system.physmem: Done
38190401500: system.physmem: Inside recvTimingReq: request Writeback addr
11133888 size 64
38190401500: system.physmem: Write queue limit 32 current size 10
38190401500: system.physmem: Address: 11133888 Rank 1 Bank 6 Row 169
38190401500: system.physmem: Adding to write queue
38190401500: system.physmem: Responding to Address 11133888.. 38190401500:
system.physmem: Done
38190452000: system.physmem: internal queues not drained
38190452000: system.physmem: not drained
38190452000: system.cpu: CPU not drained
38190452000: system.cpu.icache.cpu_side-CpuSidePort: PacketQueue not drained
38190452000: system.cpu.icache: Cache not drained
38190453000: system.cpu: CPU done draining, processing drain event
38190453000: system.cpu.icache.cpu_side-CpuSidePort: PacketQueue done
draining, processing drain event
38196600000: system.physmem: Refreshing at tick 38196600000
38204400000: system.physmem: Refreshing at tick 38204400000
38212200000: system.physmem: Refreshing at tick 38212200000
38220000000: system.physmem: Refreshing at tick 38220000000
38227800000: system.physmem: Refreshing at tick 38227800000
38235600000: system.physmem: Refreshing at tick 38235600000
38243400000: system.physmem: Refreshing at tick 38243400000
38251200000: system.physmem: Refreshing at tick 38251200000
38259000000: system.physmem: Refreshing at tick 38259000000
38266800000: system.physmem: Refreshing at tick 38266800000

Here is the cache configuration I am using. I am not too familiar with the
DRAM code. Does anyone have any ideas why the drainManger is never being
signaled when I have this setup?

def config_cache(options, system):
    if options.l2cache:
        # Provide a clock for the L2 and the L1-to-L2 bus here as they
        # are not connected using addTwoLevelCacheHierarchy. Use the
        # same clock as the CPUs, and set the L1-to-L2 bus width to 32
        # bytes (256 bits).
        system.l2 = L2Cache(clock=options.clock,
                            size=options.l2_size,
                            assoc=options.l2_assoc,
                            block_size=options.cacheline_size)

        system.tol2bus = CoherentBus(clock=options.clock, width=32)
        system.l2.cpu_side = system.tol2bus.master
        system.l2.mem_side = system.membus.slave

    for i in xrange(options.num_cpus):
        if options.caches:
            icache = L1Cache(size='32kB',
                             assoc=2,
                             block_size=options.cacheline_size)
            dcache = L1Cache(size='32kB',
                             assoc=2,
                             block_size=options.cacheline_size)
            # big core's cache
            big_icache = L1Cache(size='32kB',#options.big_l1i_size,
                             assoc=2,
                             block_size=options.cacheline_size)
            big_dcache = L1Cache(size='32kB',#options.big_l1d_size,
                             assoc=2,
                             block_size=options.cacheline_size)
            # little core's cache
            little_icache = L1Cache(size='32kB',#options.little_l1i_size,
                             assoc=2,
                             block_size=options.cacheline_size)
            little_dcache = L1Cache(size='32kB',#options.little_l1d_size,
                             assoc=2,
                             block_size=options.cacheline_size)

            # When connecting the caches, the clock is also inherited
            # from the CPU in question
            system.cpu[i].addPrivateSplitL1Caches(icache, dcache)
            system.big_cpu[i].addPrivateSplitL1Caches(big_icache,
big_dcache)
            system.little_cpu[i].addPrivateSplitL1Caches(little_icache,
little_dcache)

        system.cpu[i].createInterruptController()

        if options.l2cache:
            system.cpu[i].connectAllPorts(system.membus)
            system.big_cpu[i].connectAllPorts(system.tol2bus, system.membus)
            system.little_cpu[i].connectAllPorts(system.tol2bus,
system.membus)
        else:
            system.cpu[i].connectAllPorts(system.membus)

    return system

Thanks,
Tony
_______________________________________________
gem5-users mailing list
gem5-users@gem5.org
http://m5sim.org/cgi-bin/mailman/listinfo/gem5-users

Reply via email to