The MASM Forum

Specialised Projects => Compiler Based Assembler => Topic started by: MichaelW on April 02, 2015, 09:23:28 AM

Title: RDTSCP
Post by: MichaelW on April 02, 2015, 09:23:28 AM
I recently became aware of the RDTSCP instruction. There is an Intel whitepaper  here (http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/ia-32-ia-64-benchmark-code-execution-paper.pdf) that discusses its use in cycle-counting code. My Core i3, with two physical cores and no HTT, supports RDTSCP. Assuming that RDTSCP returns a processor or core ID, or similar, in ECX,  I thought it would be interesting to use it to monitor the processor core that my process is running on, to see if the system does move processes between cores, as I have seen some people claim it does.

I started out to do this as a 64-bit app coded in JWASM, but in the time I had to spend on it I could not find a good set of 64-bit header files, so I switched to Pelles C and POASM.

First surprise, RDTSCP seems to always return zero in ECX, independent of the process/thread affinity. Intel refers to the value in ECX as IA32_TSC_AUX,  and per  this page (https://unix4lyfe.org/benchmarking/), "the Linux kernel initializes this to the core's number, starting from zero." Also, on that same page, the "invariant TSC" stuff is interesting.
Title: Re: RDTSCP
Post by: Gunther on April 02, 2015, 10:31:02 AM
Michael,

I have the Intel whitepaper since a long time in my Manual subdirectory and was therefore a bit surprised that you didn't know it. Anyway, here is the output on my machine:

1       255
1
4923796230654   0

2       255
1
4923797664386   0

        1
        4923798708896   0
        1
        4923798938477   0
        1
        4923799514661   0
        1
        4923799789527   0
        1
        4923799998476   0
        1
        4923800198509   0
        1
        4923800406335   0
        1
        4923800599097   0
        1
        4923800824230   0
        1
        4923801211339   0


        1
        4923806399764   0
        1
        4923806817468   0
        1
        4923808551438   0
        1
        4923810258996   0
        1
        4923812142019   0
        1
        4923871502647   0
        1
        4923874142743   0
        1
        4923876262351   0
        1
        4923879064898   0
        1
        4923881090506   0


Gunther