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.
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