Умножать двойные массивы Intel MKL на массивы MKL_Complex16 (и exp)? - PullRequest
0 голосов
/ 25 мая 2018

Я учусь использовать библиотеку Intel Math Kernel.Все было хорошо до сих пор, когда мне нужно эффективно :

  1. Умножить массив значений типа double на массив MKL_Complex16s.
  2. Вычислить экспоненту iy, гдеy - массив значений типа double.

В частности, Мне требуется выполнить a = x * exp (iy), где x и y - массивы двойников одинакового размера, а a должно бытьмассив MKL_Complex16.

Поскольку MKL_Complex16 = struct {double real, imag}, я могу вручную создавать новые массивы MKL_Complex16 и записывать реальные значения в реальный член, но это кажется невероятно неэффективным.Этот расчет должен быть выполнен тысячи раз.Я также могу вручную вычислить экспоненту как синус и косинус и снова использовать цикл, но это тоже не хорошо.Возможно, есть подпрограмма, которая может копировать только в «реальный» член, но из-за возможного заполнения структуры, я не думаю, что это сработает.

Оба массива x и y вычисляются эффективно, ноКак я могу рассчитать «а» эффективно?(Это относится к части ввода в обратное БПФ с использованием MKL).

Спасибо!

1 Ответ

0 голосов
/ 26 мая 2018

Я обнаружил, что могу записать свой реальный массив значений типа double напрямую в действительные и мнимые части массива MKL_Complex16, используя 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);

Это работает на Intel Xeon Phi.Если метод используется, то вы можете комбинировать двойные массивы и массивы MKL_Complex16 для использования с MKL.Это позволило мне вычислить формулу a = x * exp (iy), как я хотел.Я надеюсь, что это поможет кому-то еще в будущем.

...