Intel® Fortran Compiler
Build applications that can scale for the future with optimized code designed for Intel® Xeon® and compatible processors.
Announcements
Welcome to the Intel Community. If you get an answer you like, please mark it as an Accepted Solution to help others. Thank you!
26740 Discussions

## Speed of REAL*8 and COMPLEX*8 number multiplication Beginner
283 Views

Hi,

I need to compare the speed of operation of REAL*8  and COMPLEX*8 number multiplication/ summation process. I used following code for that.

I presumed that real number multiplication should be at least 4 times faster than the complex number multiplication. Because mathematically we can show, to get the product of two complex numbers (e.g. product of  X= a+ib and Y=c+id  can be given as  X*Y=a*c-b*d+i(a*d+b*c) ) we need to do 4 real number multiplications.

However, when I run following code in my computer I did't see that such a difference between real and complex number multiplication process. Sometime real number multiplication time is solver than the complex number.

How that is possible to get such a results?

Is this because of that complex number multiplication process is being parallely processed?

Thanks,

Kumara

=============code=============================

REAL*8 :: realA(10000) ,realB(10000),realC(10000), startTime, midTime, endTime, Total_realTime, Total_complxTime
COMPLEX*8 cmplxA(10000), cmplxB(10000), cmplxC(10000)
integer I, K

realA = 1.0111143434
realB = -1.111143434

cmplxA = (1.0111143434, 1.0111143434)
cmplxB = (1.111143434, -1.0111143434)

CALL CPU_TIME(startTime)

DO I =1,10000000000
DO K =1, 10000
realC(K) = realA(K)*realB(K)+realA(K)*realB(K)
ENDDO
ENDDO

CALL CPU_TIME(midTime)

DO I =1,10000000000
DO K =1, 10000
cmplxC(K) = cmplxA(K)*cmplxB(K)+cmplxA(K)*cmplxB(K)
ENDDO
ENDDO

CALL CPU_TIME(endTime)

Total_realTime= midTime - startTime
Total_complxTime = endTime- midTime

WRITE(*,*) 'REAL NUMBER OPERATION TIME', realTime
WRITE(*,*) 'COMPLEX NUMBER OPERATION TIME',complxTime

2 Replies Employee
283 Views

This is because you are doing double precision real multiplication but single precision complex multiplication.

I think the misunderstanding is in COMPLEX*8  -  this allocates 8 bytes to the complex number, so it consists of two 4-byte reals, i.e., single precision.

If you would use COMPLEX(8) instead, the complex data type consists of two 8-byte reals, so 16 bytes in all.  (Reals don't have this problem, REAL*8 is the same as REAL(8) ).  If you run with COMPLEX(8), you should see that complex multiplications run several times slower than real ones, since you are doing 4 real multiplications, an addition and a subtraction. (And possibly a shuffle, if part of a vectorized loop). Beginner
283 Views

It make sense, thank you very much 