将英特尔 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)相乘?的主要内容,如果未能解决你的问题,请参考以下文章
英特尔 MKL 或一些类似的库是不是提供了一种矢量化方式来计算数组中满足 C 中某些条件的元素数量?