В этом примере показано, как ускорить антенну и анализ массивов с помощью Parallel Computing Toolbox™.
Этот пример требует следующего продукта:
Parallel Computing Toolbox
Анализ эффективности антенны по диапазону частот является важной частью проекта антенны. Исследования порта включают импеданс, returnLoss, sparameters, vswr; поверхностные исследования включают текущий и заряд; и полевые исследования включают шаблон, EHfields, axialRatio, и ширину луча. В этом примере мы демонстрируем преимущества параллельных вычислений для вычислительного коэффициента эллиптичности и возвращаем потерю по диапазону частот.
Вычислите коэффициент эллиптичности Архимедовой спирали по диапазону частот 0,8 к 2,5 ГГц с шагом 100 МГц. Это вычисление сделано последовательно, и время, потраченное, чтобы выполнить эти расчеты, сохранено в переменной time1.
sp = spiralArchimedean('Turns',4,'InnerRadius',5.5e-3,'OuterRadius',50e-3); freq = 0.8e9:100e6:2.5e9; AR = zeros(size(freq)); tic for m = 1:numel(freq) AR(m) = axialRatio(sp, freq(m), 0, 90); end time1 = toc;
Повторите вычисления с помощью Parallel Computing Toolbox, чтобы уменьшать время вычисления. Используйте функцию parpool, чтобы создать параллельный кластер пула. Затем используйте parfor, чтобы вычислить коэффициент эллиптичности по тому же диапазону частот. Время, потраченное, чтобы выполнить расчет, сохранено в переменной time2.
pardata = parpool;
Starting parallel pool (parpool) using the 'local' profile ... Connected to the parallel pool (number of workers: 6).
sp = spiralArchimedean('Turns',4,'InnerRadius',5.5e-3,'OuterRadius',50e-3); ARparfor = zeros(size(freq)); tic; parfor m = 1:numel(freq) ARparfor(m) = axialRatio(sp, freq(m), 0, 90); end time2 = toc;
Приведенная ниже таблица показывает время, потраченное для анализа коэффициента эллиптичности с и ни с чем не сравнимого Вычислительного Тулбокса. Кластерная информация сохранена в переменной pardata.
cases = {'Without Parallel Computing';'With Parallel Computing'}; time = [time1; time2]; numWorkers = [1; pardata.NumWorkers]; disp(table(time,numWorkers,'RowNames', cases))
time numWorkers ______ __________ Without Parallel Computing 46.155 1 With Parallel Computing 18.382 6
fprintf('Speed-up due to parallel computing = %g', time1/time2)
Speed-up due to parallel computing = 2.5109
График ниже показов данные о коэффициенте эллиптичности, вычисленные для двух случаев. Результаты идентичны.
plot(freq./1e9, AR,'r+', freq./1e9, ARparfor,'bo'); grid on; xlabel('Frequency (GHz)'); ylabel('Axial ratio (dB)'); title('Axial ratio of Archimedean spiral antenna at boresight'); legend('Without Parallel Computing','With Parallel Computing', ... 'location', 'Best');
Во время этого анализа структура антенны поймана в сети на каждой частоте, и затем далекие поля вычисляются на той частоте, чтобы вычислить коэффициент эллиптичности. Один способ уменьшать аналитическое время состоит в том, чтобы поймать в сети структуру вручную путем определения максимальной длины ребра.
Предыдущий раздел выполнил полевой аналитический расчет. Все поле и поверхностные аналитические расчеты в Antenna Toolbox™ принимают только скалярную частоту, как введено. Принимая во внимание, что, returnLoss и все другие аналитические функции порта принимают вектор частоты, как введено.
Когда вектор частоты задан как вход, структура антенны поймана в сети на самой высокой частоте. Получившаяся mesh используется для выполнения анализа по заданному диапазону частот. Процессорное время, потраченное, чтобы выполнить расчет, сохранено в переменной time3.
sp = spiralArchimedean('Turns',4,'InnerRadius',5.5e-3,'OuterRadius',50e-3); tic; RL = returnLoss(sp, freq); time3 = toc;
Если мы будем использовать цикл parfor путем передачи одной частоты за один раз (как показано в дискуссии о axialRatio), запутывающее произойдет на каждой частоте. Это ограничит преимущество параллельных вычислений. Более оптимальный вариант состоит в том, чтобы вручную поймать в сети структуру и затем использовать цикл parfor, чтобы запустить развертку частоты. Простой способ сделать это должно запустить анализ на самой высокой частоте сначала и получить информацию mesh с помощью mesh
функция. Используйте максимальную длину ребра в mesh
функция, чтобы гарантировать, что та же mesh используется для всех расчетов. Время, потраченное, чтобы выполнить расчет, сохранено в переменной time4.
sp = spiralArchimedean('Turns',4,'InnerRadius',5.5e-3,'OuterRadius',50e-3); RLparfor = zeros(size(freq)); tic; temp = returnLoss(sp, freq(end)); meshdata = mesh(sp); [~] = mesh(sp, 'MaxEdgeLength', meshdata.MaxEdgeLength); parfor m = 1:numel(freq) RLparfor(m) = returnLoss(sp, freq(m)); end time4 = toc;
Приведенная ниже таблица указала время, потраченное для вычисления потери возврата с и ни с чем не сравнимого Вычислительного Тулбокса. Кластерная информация сохранена в переменной pardata.
cases = {'Without Parallel Computing';'With Parallel Computing'}; time = [time3; time4]; numWorkers = [1; pardata.NumWorkers]; disp(table(time,numWorkers,'RowNames', cases))
time numWorkers ______ __________ Without Parallel Computing 5.5858 1 With Parallel Computing 3.3974 6
fprintf('Speed-up due to parallel computing = %g', time3/time4);
Speed-up due to parallel computing = 1.64412
График ниже показов данные о возврате потерь, вычисленные для двух случаев. Результаты идентичны.
plot(freq./1e9, RL,'r+', freq./1e9, RLparfor,'bo'); grid on; xlabel('Frequency (GHz)'); ylabel('Return loss (dB)'); title('Return loss of Archimedean spiral antenna'); legend('Without Parallel Computing','With Parallel Computing', ... 'location', 'Best');
Удалите текущий параллельный пул.
delete(gcp);