From Msim

Revision as of 23:47, 17 February 2010 by Jloew (Talk | contribs)
Jump to: navigation, search

This page refers to the changes made in the 3.0.15 release of M-sim.

Release Date:


Fetch (SMT) Bug

If a thread fetched an instruction that missed into either the TLB or I-Cache, fetch was suspended for that thread. It was possible, in SMT, that other threads could then evict the instruction that was missed. When the thread resumes, it would miss again.
Additionally, the flags set to indicate these misses were never used.
The fetch logic has been reorganized, no longer do we "continue;" when there is an I-cache/I-TLB miss. The adjustment to fetch_issue_delay ensures that no further instructions will be fetched. At the time we insert the instruction into the IFQ, we increment fetched_cycle by (lat - 1). This does not affect normal instructions but ensures that the miss delay is taken into account for this instruction.



Partial support for negative pids. Does not propagate kills but does kill the initial child.


Returns static maximum values as defined in syscall.c


Does not allow setting, maximum values are not changable by the thread.


Additional requests are now handled: GSI_PROC_TYPE, GSI_CPU_INFO, GSI_PLATFORM_NAME (buffer overflow not handled correctly, name truncated instead), GSI_PHYSMEM, GSI_MAX_CPU, GSI_CPUS_IN_BOX, GSI_TIMER_MAX.


This is now partially supported. useconds is multiplied by 1000 and added to a variable number (starts at 200, incremented by 1 each time any thread uses it, modulo 1000). In fast-forward mode, the thread is skipped for that many cycles. This is not implemented in full-simulation since pipeline scheduling should prevent usleep/load_conditional/store_conditional problems.

For example, observe the performance of swim and wupwise:
../sim-outorder -fastfwd 10000000 -max:inst 1000000 -rf:size 1024 bzip2NS.1.arg swimNS.1.arg twolfNS.1.arg wupwiseNS.1.arg
IPC 0 (bzip2NS.1.arg): 0.258778
IPC 1 (swimNS.1.arg): 0.000915008
IPC 2 (twolfNS.1.arg): 2.86837
IPC 3 (wupwiseNS.1.arg): 0.000915008
In this case, there is a conditional load paired with a memory barrier and a conditional store. During fast-forward, they are lock-stepped and neither can progress. After fast-forward, they end up in a similar situation (however, it is possible for pipeline conditions to allow this to end). After this syscall change:
IPC 0 (bzip2NS.1.arg): 0.253994
IPC 1 (swimNS.1.arg): 2.22891
IPC 2 (twolfNS.1.arg): 1.18452
IPC 3 (wupwiseNS.1.arg): 1.36776


osf_sys_lseek does not return -1 when called on stdin, stdout or stderr on Tru64. Empirically, it appears to output the total number of characters printed for the current session.

#include <sys/types.h>
#include <unistd.h>
#include <iostream>

int main()
       cout << "Weeee!" << endl;
       for(int i=0;i<10;i++)
               off_t sval = lseek(i,0,1);
               cout << i << ":  " << sval << endl;
       return 0;

On a new session:

jloew@tru64:~/syscall$ ./a.out
0:  722
1:  730
2:  738
3:  -1
4:  -1
5:  -1
6:  -1
7:  -1
8:  -1
9:  -1

Second execution:

jloew@tru64:~/syscall$ ./a.out
0:  864
1:  872
2:  880
3:  -1
4:  -1
5:  -1
6:  -1
7:  -1
8:  -1
9:  -1

The difference is consistent (typing into the command prompt and deleting it will increase this counter).

Personal tools