Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiplying Intel MKL double arrays with MKL_Complex16 arrays (and exp)?

I've been learning to use Intel Math Kernel Library. Everything has been fine until now when I require to efficiently:

  1. Multiply an array of doubles by an array of MKL_Complex16s.
  2. Compute the exponential of iy where y is an array of doubles.

Specifically, I require to perform a = x * exp(iy) where x and y are arrays of doubles of the same size, and a should be an array of MKL_Complex16.

Since MKL_Complex16 = struct { double real, imag } I can manually make new arrays of MKL_Complex16 and write the real values to the real member, but that seems incredibly inefficient. This calculation is required to be performed thousands of times. I can also manually compute the exponential as sine and cosine, and again use a loop, but that isn't good either. Perhaps there is a routine that can copy into only the "real" member, but because of possible padding of the structure, I don't think that would work.

Both x and y arrays are evaluated efficiently, but how can I calculate "a" efficiently? (This is to to part of the input to a reverse FFT using MKL).

Thank you!

like image 263
Normandin Avatar asked Jan 19 '26 15:01

Normandin


1 Answers

I found that I could write my real array of doubles directly to the real and imaginary parts of the array of MKL_Complex16 using cblas_dcopy.

double *real = (double*) mkl_malloc(N*sizeof(double), 64);
double *imag = (double*) mkl_malloc(N*sizeof(double), 64);
MKL_Complex16* z = (MKL_Complex16*) mkl_malloc(N*sizeof(MKL_Complex16), 64);

// Fill real and imag arrays with your data, then write them to the complex array

cblas_dcopy(N, real, 1, &(z[0].real), 2);
cblas_dcopy(N, imag, 1, &(z[0].imag), 2);

This worked on the Intel Xeon Phi. If the technique is used then you can combine double arrays and MKL_Complex16 arrays for use with MKL. It allowed me to compute the formula a = x * exp(iy), as I wanted. I hope that this helps someone else in the future.

like image 58
Normandin Avatar answered Jan 21 '26 08:01

Normandin