Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why would one CPU core run slower than the others?

I was benchmarking a large scientific application, and found it would sometimes run 10% slower given the same inputs. After much searching, I found the the slowdown only occurred when it was running on core #2 of my quad core CPU (specifically, an Intel Q6600 running at 2.4 GHz). The application is a single-threaded and spends most of its time in CPU-intensive matrix math routines.

Now that I know one core is slower than the others, I can get accurate benchmark results by setting the processor affinity to the same core for all runs. However, I still want to know why one core is slower.

I tried several simple test cases to determine the slow part of the CPU, but the test cases ran with identical times, even on slow core #2. Only the complex application showed the slowdown. Here are the test cases that I tried:

  • Floating point multiplication and addition:

    accumulator = accumulator*1.000001 + 0.0001;
    
  • Trigonometric functions:

    accumulator = sin(accumulator);
    accumulator = cos(accumulator);
    
  • Integer addition:

    accumulator = accumulator + 1;
    
  • Memory copy while trying to make the L2 cache miss:

    int stride = 4*1024*1024 + 37;  // L2 cache size + small prime number
    for(long iter=0; iter<iterations; ++iter) {
        for(int offset=0; offset<stride; ++offset) {
            for(i=offset; i<array_size; i += stride) {
                array1[i] = array2[i];
            }
        }
    }
    

The Question: Why would one CPU core be slower than the others, and what part of the CPU is causing that slowdown?

EDIT: More testing showed some Heisenbug behavior. When I explicitly set the processor affinity, then my application does not slow down on core #2. However, if it chooses to run on core #2 without an explicitly set processor affinity, then the application runs about 10% slower. That explains why my simple test cases did not show the same slowdown, as they all explicitly set the processor affinity. So, it looks like there is some process that likes to live on core #2, but it gets out of the way if the processor affinity is set.

Bottom Line: If you need to have an accurate benchmark of a single-threaded program on a multicore machine, then make sure to set the processor affinity.

like image 581
Edi H Avatar asked May 13 '09 18:05

Edi H


1 Answers

You may have applications that have opted to be attached to the same processor(CPU Affinity).

Operating systems would often like to run on the same processor as they can have all their data cached on the same L1 cache. If you happen to run your process on the same core that your OS is doing a lot of its work on, you could experience the effect of a slowdown in your cpu performance.

It sounds like some process is wanting to stick to the same cpu. I doubt it's a hardware issue.

It doesn't necessarily have to be your OS doing the work, some other background daemon could be doing it.

like image 99
Kekoa Avatar answered Oct 02 '22 01:10

Kekoa