PIC32MX: Benchmarking Mathematical Operations

From Mech
Revision as of 17:39, 9 February 2010 by ToddPoole (talk | contribs)
Jump to navigationJump to search

Original Assignment

Do not erase this section!

Your assignment is to empirically test how long it takes to perform add, subtract, multiply, divide, sqrt, sin, and cos operations with the 80 MHz PIC32460F512L and our standard code optimization setting. You will do these tests with chars (8-bit integers), shorts (16-bit), integers (32-bit), long long integers (64-bit), floats (32-bit single precision floating point), and double (64-bit double-precision floating point). The integers can be unsigned or signed. Your end result will be a table with the operation on one axis (likely the horizontal axis) and the kind of variable on the other axis, and each cell of the table will have a normalized duration for the operation. The time will be normalized by the fastest operation, so the smallest number in the table will be 1.00. All other numbers will indicate how many times longer that operation takes. All numbers will have two decimal places, e.g., 2.57 or 24.72. You will also give the time that 1.00 corresponds to in nanoseconds.

Since bit-shifting left and right correspond to a version of multiplying and dividing, you should also include the operations >>1 and >>4 and <<1 and <<4. (If the results are identical, you can eliminate shift left from your table.)

To generate this table, you can set an output bit low before the operation, then high immediately after the operation, and measure the time on an oscilloscope. Two things to consider: (1) Time a single operation, over and over, with a short delay between the operation. This should create a pulse train on your oscilloscope. Can you get an accurate estimate of the time this way? You could also try doing five or ten operations between changing the digital output. See if this gives the same estimate. (This estimate might be more accurate as you are essentially averaging over a number of operations.) Avoid using arrays and for loops in your test, as indexing arrays and running the loop each take time. (2) Make sure the compiler doesn't compute the results in advance. You could try testing operations with numbers generated randomly (don't time this operation!) vs. numbers that you just type in manually to make sure that both are giving you the same result.

Overview

We were tasked with determining the real-time cost (measured in nanoseconds) of performing seven basic mathematical operations with each one of the six commonly used ANSI C data types.

The mathematical operations we tested were:

  • subtraction
  • addition
  • multiplication
  • division
  • square root
  • sine
  • cosine
  • >>1
  • >>4

We six data types we tested each operation on were:

  • char
  • short
  • integer
  • long long
  • float
  • double

Our testing procedure was simple: throw an output pin on the NU32 development board high, perform a mathematical operation with a given data type, and then pull the same pin low.

Placing the above three steps in an infinite while loop afforded us the opportunity to use an oscilloscope to measure the duration between each high-low pair in the output waveform. After subtracting the time it took for the PIC to raise and lower the voltage on the output pin (something we previously measured), we were able to determine the amount of time required for the PIC32 chip to execute any specific mathematical operation with a high level of accuracy.

With seven operations to perform on six different data types, we created the following table to help us assign and keep track of the various tests we planned to run:

Operation vs. Data type
char (8-bit) short (16-bit) int (32-bit) long long (64-bit) float (32-bit) double (64-bit)
subtraction Test 2 Test 9 Test 16 Test 23 Test 30 Test 37
addition Test 3 Test 10 Test 17 Test 24 Test 31 Test 38
multiplication Test 4 Test 11 Test 18 Test 25 Test 32 Test 39
division Test 5 Test 12 Test 19 Test 26 Test 33 Test 40
square root Test 6 Test 13 Test 20 Test 27 Test 34 Test 41
sine Test 7 Test 14 Test 21 Test 28 Test 35 Test 42
cosine Test 8 Test 15 Test 22 Test 29 Test 36 Test 43


Test 1 was used to determine the duration required for the PIC32 to throw a pin high and pull a pin low, while Tests 2 through 43 were used to measure the actual performance of each (operation, data-type) pair.

Results

A summary of what we determined in each test... (things like period, frequency, special notes, blah blah)

Basic Timing Constants (Test 1)

This test determines the length of time required by the PIC32 chip to push a given output pin high and pull the same pin low.

char Performance

A char data type, in ANSI C, is a value holding one byte, or one character code. The actual number of bits in a char in a particular implementation is documented as CHAR_BIT in that implementation's limits.h file. In practice, it is almost always 8 bits, corresponding to a decimal range of 0 to 255, inclusive.

Subtraction (Test 2)

This test determines the length of time required by the PIC32 chip to subtract one 8-bit number (a char) from another 8-bit number (a char).

Addition (Test 3)

This test determines the length of time required by the PIC32 chip to add one 8-bit number (a char) to another 8-bit number (a char).

Multiplication (Test 4)

This test determines the length of time required by the PIC32 chip to multiply one 8-bit number (a char) by another 8-bit number (a char).

Division (Test 5)

This test determines the length of time required by the PIC32 chip to divide one 8-bit number (a char) by another 8-bit number (a char).

Square Root (Test 6)

This test determines the length of time required by the PIC32 chip to square root one 8-bit number (a char).

Sine (Test 7)

This test determines the length of time required by the PIC32 chip to get the sine of one 8-bit number (a char).

Cosine (Test 8)

This test determines the length of time required by the PIC32 chip to get the cosine of one 8-bit number (a char).

short Performance

Subtraction (Test 9)

This test determines the length of time required by the PIC32 chip to subtract one 16-bit number (a short) from another 16-bit number (a short).

Addition (Test 10)

This test determines the length of time required by the PIC32 chip to add one 16-bit number (a short) to another 16-bit number (a short).

Multiplication (Test 11)

This test determines the length of time required by the PIC32 chip to multiply one 16-bit number (a short) by another 16-bit number (a short).

Division (Test 12)

This test determines the length of time required by the PIC32 chip to divide one 16-bit number (a short) by another 16-bit number (a short).

Square Root (Test 13)

This test determines the length of time required by the PIC32 chip to get the square root of one 16-bit number (a short).

Sine (Test 14)

This test determines the length of time required by the PIC32 chip to get the sine of one 16-bit number (a short).

Cosine (Test 15)

This test determines the length of time required by the PIC32 chip to get the cosine of one 16-bit number (a short).

int Performance

Subtraction (Test 16)

This test determines the length of time required by the PIC32 chip to subtract one 32-bit number (an int) from another 32-bit number (an int).

Addition (Test 17)

This test determines the length of time required by the PIC32 chip to add one 32-bit number (an int) to another 32-bit number (an int).

Multiplication (Test 18)

This test determines the length of time required by the PIC32 chip to multiply one 32-bit number (an int) by another 32-bit number (an int).

Division (Test 19)

This test determines the length of time required by the PIC32 chip to divide one 32-bit number (an int) by another 32-bit number (an int).

Square Root (Test 20)

This test determines the length of time required by the PIC32 chip to get the square root of one 32-bit number (an int).

Sine (Test 21)

This test determines the length of time required by the PIC32 chip to get the sine of one 32-bit number (an int).

Cosine (Test 22)

This test determines the length of time required by the PIC32 chip to get the cosine of one 32-bit number (an int).

long long Performance

Subtraction (Test 23)

This test determines the length of time required by the PIC32 chip to subtract one 64-bit number (a long long) from another 64-bit number (a long long).

Addition (Test 24)

This test determines the length of time required by the PIC32 chip to add one 64-bit number (a long long) to another 64-bit number (a long long).

Multiplication (Test 25)

This test determines the length of time required by the PIC32 chip to multiply one 64-bit number (a long long) by another 64-bit number (a long long).

Division (Test 26)

This test determines the length of time required by the PIC32 chip to divide one 64-bit number (a long long) by another 64-bit number (a long long).

Square Root (Test 27)

This test determines the length of time required by the PIC32 chip to get the square root of one 64-bit number (a long long).

Sine (Test 28)

This test determines the length of time required by the PIC32 chip to get the sine of one 64-bit number (a long long).

Cosine (Test 29)

This test determines the length of time required by the PIC32 chip to get the cosine of one 64-bit number (a long long).

float Performance

Subtraction (Test 30)

This test determines the length of time required by the PIC32 chip to subtract one 32-bit number (a float) from another 32-bit number (a float).

Addition (Test 31)

This test determines the length of time required by the PIC32 chip to add one 32-bit number (a float) to another 32-bit number (a float).

Multiplication (Test 32)

This test determines the length of time required by the PIC32 chip to multiply one 32-bit number (a float) by another 32-bit number (a float).

Division (Test 33)

This test determines the length of time required by the PIC32 chip to divide one 32-bit number (a float) by another 32-bit number (a float).

Square Root (Test 34)

This test determines the length of time required by the PIC32 chip to get the square root of one 32-bit number (a float).

Sine (Test 35)

This test determines the length of time required by the PIC32 chip to get the sine of one 32-bit number (a float).

Cosine (Test 36)

This test determines the length of time required by the PIC32 chip to get the cosine of one 32-bit number (a float).

double Performance

Subtraction (Test 37)

This test determines the length of time required by the PIC32 chip to subtract one 64-bit number (a double) from another 64-bit number (a double).

Addition (Test 38)

This test determines the length of time required by the PIC32 chip to add one 64-bit number (a double) to another 64-bit number (a double).

Multiplication (Test 39)

This test determines the length of time required by the PIC32 chip to multiply one 64-bit number (a double) by another 64-bit number (a double).

Division (Test 40)

This test determines the length of time required by the PIC32 chip to divide one 64-bit number (a double) by another 64-bit number (a double).

Square Root (Test 41)

This test determines the length of time required by the PIC32 chip to get the square root of one 64-bit number (a double).

Sine (Test 42)

This test determines the length of time required by the PIC32 chip to get the sine of one 64-bit number (a double).

Cosine (Test 43)

This test determines the length of time required by the PIC32 chip to get the cosine of one 64-bit number (a double).

Code

Test 1

This is the first test.

Test 2

This is the second test.

Blah blah blah, I would really like to be watching the super bowl right about now. /sigh.

Code

Test 1

This is the first test.

Test 2

This is the second test.

Blah blah blah, I would really like to be watching the super bowl right about now. /sigh.