AnsweredAssumed Answered

strange temperature-related performance changes on i.MX6x

Question asked by Marc-Oliver Westerburg on Feb 17, 2017
Latest reply on Feb 28, 2017 by Marc-Oliver Westerburg

Hi all

 

 

While testing several devices of a new batch of our most recent i.MX6-platform I noticed some strange performance differences depending on temperature and board itself and, which puzzles me the most, some boards (or CPUs?) show different characteristics than other identical boards. 

 

I was wondering, if this is normal behavior (maybe due to manufacturing tolerances of PCBs, i.MX6-SoC or other components) or some indicator of some kind of problem. 

 

The test is a very simple time-measurement (using an EPIT-timer running at 500 KHz) of a 100 executions of 4 MB memset(0)-commands running in an infinite loop on a "bare-metal" system, i.e. the code is started directly by the i.MX6 Boot-ROM and runs immediately after DDR3-DRAM initialization

  • no OS, no interrupts or DMA,
  • no GPU, IPU, Ethernet, USB or other components running,
  • on multi-core SoCs only one single ARM-core is running,
  • all clocks and voltages running at power-on default values (800 MHz ARM clock),
  • no power-management active.

While some boards show "rock-solid" performance, which hardly changes at all, other (identical) boards show performance differences from test-cycle to test-cycle of up to 1%, some (also identical) boards even "slow down" from best performance at the start of the test (with a cold CPU) to about 2% slower performance measurements after about 15 minutes, others "speed up", instead.

 

The performance characteristics of each board seem to be deterministic of multiple power-cycles. Boards showing more variance in performance also are more sensitive to external temperature changes of the i.MX6 SoC, i.e. cooling down the SoC using cooling spray shows far greater effects on boards that show larger performance variations already. Cooling anything else but the SoC doesn't seem to make a difference, though.

 

After noticing this on one kind of i.MX6 platform, I tried the same test on different board designs with different i.MX6-SoC-types, as well, with similar results.

 

Let me show you some pictures of my measurement (on different board-designs with different SoC-type):

 

Here is the code I am executing (on "bare-metal"):

 

num_runs = 100;
size = 4096*1024;
while (1) {
     for (j = 0; pBuffers[j] && j < NUM_BUFFERS; j++)
     {
          ticksStart = get_tick();
          for (i = 0; i < num_runs; i++)
               memset((void *)pBuffers[j], 0, size);
          ticksEnd = get_tick();
          printf("%u:C-memset 0-->#%03u...     %6u ticks (%6u KB/s)\n", cpu, j, diff_tick(ticksStart,ticksEnd), (1000*num_runs*(size>>10))/(diff_tick(ticksStart,ticksEnd)/500));
     }
}

 

get_tick() just reads the counter value from an EPIT-timer running at 500 KHz. printf() sends the output to a UART running at 115200 baud. Removing the printf(), toggling a GPIO-pin and measuring the performance via oscilloscope, instead, shows the same behavior.

 

Anybody else ever noticed such variations in performance? Can this be normal, maybe ARM-, System-, and Peripheral-PLLs of the SoC drifting against each other? Or can this be an indicator of some kind of more serious problem?

 

(All of the board-designs a running for years, already, without any issues otherwise.)

 

 

Kind regards,

Marc

Outcomes