将英特尔 MKL 双数组与 MKL_Complex16 数组(和 exp)相乘?

Posted

技术标签:

【中文标题】将英特尔 MKL 双数组与 MKL_Complex16 数组(和 exp)相乘?【英文标题】:Multiplying Intel MKL double arrays with MKL_Complex16 arrays (and exp)? 【发布时间】:2018-05-25 05:54:11 【问题描述】:

我一直在学习使用英特尔数学核心函数库。直到现在我需要高效时一切都很好:

    将双精度数组乘以 MKL_Complex16 数组。 计算 iy 的指数,其中 y 是双精度数组。

具体来说,我需要执行 a = x * exp(iy),其中 x 和 y 是相同大小的双精度数组,a 应该是 MKL_Complex16 的数组。

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

x 和 y 数组都被有效地评估,但我怎样才能有效地计算“a”呢? (这是使用 MKL 将部分输入用于反向 FFT)。

谢谢!

【问题讨论】:

【参考方案1】:

我发现我可以使用 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);

这适用于英特尔至强融核。如果使用该技术,那么您可以将双数组和 MKL_Complex16 数组结合起来与 MKL 一起使用。它让我可以根据需要计算公式 a = x * exp(iy)。我希望这对将来的其他人有所帮助。

【讨论】:

以上是关于将英特尔 MKL 双数组与 MKL_Complex16 数组(和 exp)相乘?的主要内容,如果未能解决你的问题,请参考以下文章

将 gfortran 与英特尔 MKL 链接

将未知大小的数组(子程序输出)传递给另一个子程序

英特尔 MKL 或一些类似的库是不是提供了一种矢量化方式来计算数组中满足 C 中某些条件的元素数量?

Intel MKL(Math Kernel Library)

英特尔 MKL 和 Oracle R 分发版

编译使用带有gfortran的英特尔MKL模块的代码