Of course. The function I've been using to dump memory was written by a former member of my group, so if there are questions about how it works I'll probably need to get in touch with him to ask. Here's the code:

void dump_pmem(const char * name)
{
    FILE *f;
    uint32_t l;
    uint8_t buf[1024];
    Monitor *mon = cur_mon;
    uint32_t size = 1024 * 1024 * 1024;    // Using a 1GB memory
    const char *filename = name;
    target_phys_addr_t addr = 0x0;

    f = fopen(filename, "wb");
    if (!f) {
        monitor_printf(mon, "could not open '%s'\n", filename);
        return;
    }
    while (size != 0) {
        l = sizeof(buf);
        if (l > size)
            l = size;
        cpu_physical_memory_rw(addr, buf, l, 0);
        fwrite(buf, 1, l, f);
        fflush(f);
        addr += l;
        size -= l;
    }
    fclose(f);
}

To make the dump, I modified the beginning of ptl_check_ptlcall_queue() in ptl-qemu.cpp so it looks as follows:

void ptl_check_ptlcall_queue() {

    if(pending_call_type != -1) {

        switch(pending_call_type) {
            case PTLCALL_ENQUEUE:
                {
                    // Begin new code
                    if (!strcmp(pending_command_str, "-run")) {
cout << "Simulator about to start, dumping memory\n";
                        char buffer[64];
                        sprintf(buffer, "prestart-memdump");
                        dump_pmem(buffer);
                    }
                    // End new code

if (!config.quiet) cout << "MARSSx86::Command received : ",
                         pending_command_str, endl;
                    ptl_machine_configure(pending_command_str);

This caused the simulator to create the memory dump file when the "-run" command was received. Once I had dump files from separate runs, as I mentioned before, I used the vbindiff tool ( http://www.cjmweb.net/vbindiff/) to compare them. That's it in a nutshell, let me know if I can explain anything further.

Avadh, you mentioned that you're wondering if it's a checkpointing issue. It's worth noting that I did a similar experiment where I dumped memory as soon as QEMU finished the checkpoint load operations (I added a call to dump_pmem at the end of load_vmstate in savevm.c), and every single dump from that location is exactly the same. So, I'm reasonably certain that QEMU always loads the memory in exactly the same state, which is why I'm pretty sure there's something going on between checkpoint load completing and the simulator starting. Please let me know if you figure anything out, I'll probably probe it a little further on my end.
-Addison

On 01/10/2012 01:13 PM, avadh patel wrote:
This is a great find as we are also trying to find out some issues with checkpoints. I am not expert in QEMU so I have no idea what is restored when we continue execution from a checkpoint and do they modify and memory (like clock and some driver stats etc.). If you can share the method on how you collect your memory diffs then it will save lot of time in debugging.

Thanks,
Avadh

On Tue, Jan 10, 2012 at 10:01 AM, Addison Mayberry <[email protected] <mailto:[email protected]>> wrote:

    I've been using a tool called VBinDiff (visual binary diff), so I
    can see exactly where the files are different. The differences are
    relatively small, only a few hundred bytes concentrated in a few
    areas. However, since I'm relatively sure that my performance
    variations are stemming from differences in memory state I don't
    want to ignore anything that might be causing those differences
    (and also I'm just curious as to what's happening.)


    On 01/10/2012 11:27 AM, Paul Rosenfeld wrote:
    I don't know the answer to your question, but this is certainly a
    very interesting experiment.

    Are you doing "different or same" comparison or do you have some
    sense of how different the memory dumps are? Are we talking a few
    bytes or large swaths of memory?

    On Tue, Jan 10, 2012 at 11:10 AM, Addison Mayberry
    <[email protected] <mailto:[email protected]>> wrote:

        Greetings,
        I am trying do some detailed performance tests, and to get
        more consistent data I have been trying to weed out issues
        that cause variation in my results on repeated executions of
        the same program from the same image checkpoint. To that end
        I started doing some analysis on the following two lines of
        code being executed in the simulator:

           ptlcall_checkpoint_and_shutdown("connection-made");
           ptlcall_single_flush("-run");

        After which my benchmark code begins to run. I added code in
        PTLSim to do a dump of simulated physical memory when it
        receives the "-run" instruction, and comparing these dumps
        across multiple runs I found that they were different.

        I was aware that MARSS is not guaranteed (or expected) to
        have deterministic performance, but I was surprised that
        there would be variations in the execution over such a small
        period of time - between loading the checkpoint and then
        dropping into simulation. Does anyone have any thoughts on
        what might be causing the differences in memory state, and
        what I might be able to do to keep that from happening and
        make my tests more repeatable? Thanks for any insight.
        Sincerely,
        Addison

        _______________________________________________
        http://www.marss86.org
        Marss86-Devel mailing list
        [email protected]
        <mailto:[email protected]>
        https://www.cs.binghamton.edu/mailman/listinfo/marss86-devel





    _______________________________________________
    http://www.marss86.org
    Marss86-Devel mailing list
    [email protected]
    <mailto:[email protected]>
    https://www.cs.binghamton.edu/mailman/listinfo/marss86-devel



_______________________________________________
http://www.marss86.org
Marss86-Devel mailing list
[email protected]
https://www.cs.binghamton.edu/mailman/listinfo/marss86-devel

Reply via email to