将英特尔MKL双阵列与MKL_Complex16阵列(和exp)相乘?

时间:2018-05-25 05:54:12

标签: intel exponential intel-mkl

我一直在学习使用英特尔数学核心库。到目前为止,当我需要有效时,一切都很好:

  1. 乘以MKL_Complex16s数组的双精度数组。
  2. 计算iy的指数,其中y是双精度数组。
  3. 具体来说,我需要执行a = x * exp(iy),其中x和y是相同大小的双精度数组,a应该是MKL_Complex16的数组。

    由于MKL_Complex16 = struct {double real,imag}我可以手动创建MKL_Complex16的新数组并将真实值写入真实成员,但这看起来非常低效。该计算需要执行数千次。我也可以手动计算指数为正弦和余弦,并再次使用循环,但这也不好。也许有一个例程可以只复制到“真正的”成员,但由于可能填充结构,我认为这不会起作用。

    有效评估x和y数组,但如何有效地计算“a”? (这是使用MKL对反向FFT的部分输入)。

    谢谢!

1 个答案:

答案 0 :(得分:0)

我发现我可以使用cblas_dcopy将我真正的双打数组直接写入MKL_Complex16数组的实部和虚部。

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);

这适用于Intel Xeon Phi。如果使用该技术,则可以将双数组和MKL_Complex16数组组合使用以与MKL一起使用。它允许我按照我的意愿计算公式a = x * exp(iy)。我希望将来能有所帮助。