|
|
View previous topic :: View next topic |
Author |
Message |
.C
Joined: 06 May 2004 Posts: 19 Location: Italy
|
Multiplications |
Posted: Sun May 23, 2004 2:40 am |
|
|
Hi,
PIC18 family:
If I write a=b*c , Does the compiler use hardware multiplication?
Or I have to use a special 'C' istruction or built-in functions?
Thank |
|
|
C-H Wu Guest
|
|
Posted: Sun May 23, 2004 2:56 am |
|
|
It depends on the data type, here's my test report with PCH 3.200
Code: | // computation speed: ( usec ) 16F877 18F452 Wu
// ---------------------------------------------------------------
// ----- int8 * int8 10 1
// ----- int16 * int16 48 7 9
// ----- s_int16 * s_int16 50 7 9
// . . with saturation routine -- -- 21
// ----- s_int32 * s_int32 127 45
// ----- float + float -- 37 !
// ----- float * float 136 136 ! 52 (1e-7)
// ----- float / float 277 277 287 (1e-7)
// 200 (1e-5)
|
It seems that they still don't like the hardware multiplier for float multiplication, and my own float_mult() routine is still three times faster. |
|
|
.C
Joined: 06 May 2004 Posts: 19 Location: Italy
|
|
Posted: Mon May 24, 2004 2:31 am |
|
|
In the my code I wrote :
long A;
int b;
A=B*.800;
but I have not seen in the dissassemby listing multiplications hardware |
|
|
Haplo
Joined: 06 Sep 2003 Posts: 659 Location: Sydney, Australia
|
|
Posted: Mon May 24, 2004 3:23 am |
|
|
Remember the hardware multiplier works only on 8-bit and 16-bit isgned/unsigned integers, not floats. |
|
|
Ttelmah Guest
|
|
Posted: Mon May 24, 2004 4:50 am |
|
|
Haplo wrote: | Remember the hardware multiplier works only on 8-bit and 16-bit isgned/unsigned integers, not floats. |
This does not matter.
All the multiplication is 'built up' from operations on smaller types. So the hardware function, can be used as one of the 'building blocks' to create the higher operation types. At present, CCS do not use this (basically, they have not re-written their own 'library' to take advantage of the ability) for floats. They have done for integers. This is why the 32*32 multiplication, has gained from the function, despite the function not handling this type. The function can be very effectively used to help when dealing with floats, but it requires the maths routine to be re-written to do so. Basically, since the chip iself (on versions without the hardware multiplier), only deals with 8bit values, and the 16bit and higher routines on these chips is built from the functions using the 8bit type, CCS elected to write the floating point routine to use only the 8bit operations. On chips with the hardware multiplier however there is a saving from using 16bit arithmetic routines (so for instance, a 16*16 multiply, only takes 7usec on the table published by C-H Wu, when a 8*8 multiply takes 10uSec, and building the 16*16 multiply using the 8*8 multiply, takes 48uSec.
On some other compilers, the hardware multiplier is used for floating point arithmetic, and the time taken for a floating point multiplication, typically halves.
Best Wishes |
|
|
Haplo
Joined: 06 Sep 2003 Posts: 659 Location: Sydney, Australia
|
|
Posted: Mon May 24, 2004 5:45 am |
|
|
Ttelmah wrote: | At present, CCS do not use this (basically, they have not re-written their own 'library' to take advantage of the ability) for floats. |
That is basically what I was trying to say |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|