Ускорение вычислений суперпозиции импульсов

Обсуждение вопросов связанных с параллельными и распределенными вычислениями

Модератор: Admin

IvanAlyaev
Пользователь
Сообщения: 3
Зарегистрирован: Пт дек 18, 2015 1:52 pm

Ускорение вычислений суперпозиции импульсов

Сообщение IvanAlyaev » Пт дек 18, 2015 2:25 pm

Здравствуйте.
Имеется сигнал, представляющий собой совокупность импульсов определенной формы. Импульс задается в виде массива заданного размера - массив может достигать размера до 30000 точек, что соответствует длительности импульса 300 наносекунд.
Импульсы случайно распределены на временной оси с известной плотностью распределения. Также эти импульсы имеют случайную амплитуду и плотность распределения тоже известна.
Требуется рассчитать такой сигнал длительностью от 1 до 60 секунд, что может соответствовать массиву с размером 6*10^12 степени.
Сейчас я пытаюсь проводить расчет по блокам с размером массива 10^7 - то есть для этого требуется 6*10^5 итераций. Одна итерация занимает порядка 15 секунд. И в итоге все происходит очень долго.
Подскажите пожалуйста способы ускорения таких вычислений. Пробовал все массивы переводить в 'gpuArray', но тогда все считается еще дольше - может что-то не так делаю.
Код для одной итерации прилагаю:

Код: Выделить всё

%%%%%%%%%%%%%%%%%%
%Создание формы импульса
%%%%%%%%%%%%%%%%%%
%name - название вида импульса
%duration - длительность импульса, нс
%dt - такт расчета, нс
function pulseArray = PulseForm(name, duration, dt)
if(nargin == 3)
    switch name
        case 'standart'
            x = [0 duration/4.29 duration/1.67 duration/1.07  duration];
            xx = 0:dt:duration;
            y = [0 1 0.5 0.06 0];
            pulse = spline(x,y,xx);
            pulse = pulse./max(pulse);
        case 'parabolic'
            x = [0 duration/2 duration];
            xx = 0:dt:duration;
            y = [0 1 0];
            pulse = spline(x,y,xx);
        otherwise
            pulse = 0;
    end
else
    error('Недостаточно входных аргументов.');
end

pulseArray = pulse;


%%%%%%%%%%%%%%%%%%
Создание массива случайных моментов возникновения
%%%%%%%%%%%%%%%%%%
%Задание параметров генератора случайных чисел
%Генератор псевдослучайных чисел "Вихрь Мерсенна"
%Потворяемость 2^19937 - 1
%N - число импульсов
%F - загрузка импульсов, Гц
%time - время воспроизведения, с
function [pulseTime, N] = ExpTimeTrue(time, F)

s = RandStream.create('mt19937ar','NumStreams',1);
RandStream.setGlobalStream(s);
%rng('shuffle');

%Получение случайных моментов возникновения импульсов
N = round(time*F);
newInt = -(1/F).*log(rand(N,1));
pulseTime = cumsum(newInt);

%%%%%%%%%%%%%%%%%%
Расчет сигнала
%%%%%%%%%%%%%%%%%%
function Signal = SignalTrue(pulseTime, pulseArray, dt,N)

tt = 0:dt:(length(pulseArray)-1)*dt;
pulseArray = pulseArray./trapz(tt,pulseArray);
pTime = round((pulseTime)./dt);
pTime = pTime+1;
L = length(pulseArray);
lastSignal = pTime(N)+L;
charge = normrnd(2e-13,5e-14,1,N);
Signal = zeros(1,lastSignal);
for j = 1:N
    rPulse = charge(j).*pulseArray;
    Signal((pTime(j)):(pTime(j)+L-1)) = Signal((pTime(j)):(pTime(j)+L-1))+rPulse;
end



Во вложении прилагаю пример распределения импульсов на временной оси. Их надо дальше суммировать.
Вложения
pict.png

sandy
Эксперт
Сообщения: 5509
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Ускорение вычислений суперпозиции импульсов

Сообщение sandy » Пт дек 18, 2015 7:21 pm

что может соответствовать массиву с размером 6*10^12 степени

Ну вот, предположим, вам удалось получить такой массив. И что вы собираетесь с ним дальше делать?
С уважением

Александр Сергиенко

IvanAlyaev
Пользователь
Сообщения: 3
Зарегистрирован: Пт дек 18, 2015 1:52 pm

Re: Ускорение вычислений суперпозиции импульсов

Сообщение IvanAlyaev » Пт дек 18, 2015 10:39 pm

Нужно посчитать дисперсию и математическое ожидание сигнала, как минимум. Плюс записать все это в файл.

sandy
Эксперт
Сообщения: 5509
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Ускорение вычислений суперпозиции импульсов

Сообщение sandy » Сб дек 19, 2015 9:53 pm

Нужно посчитать дисперсию и математическое ожидание сигнала, как минимум.

Для этого не нужно генерировать сам сигнал.
Плюс записать все это в файл.

Что "это"? Массив из 6*10^12 элементов? Если он вещественный, то в формате double это будет 48 терабайт. Вы уверены, что именно этого хотите?
С уважением



Александр Сергиенко

IvanAlyaev
Пользователь
Сообщения: 3
Зарегистрирован: Пт дек 18, 2015 1:52 pm

Re: Ускорение вычислений суперпозиции импульсов

Сообщение IvanAlyaev » Сб дек 19, 2015 11:24 pm

И каким же образом я могу посчитать дисперсию и мат. ожидание без расчета всего сигнала?

Массив с импульсом для 60-секундной записи будет содержать меньшее количество точек, чем обычно. Так что размер уменьшится значительно.

sandy
Эксперт
Сообщения: 5509
Зарегистрирован: Ср сен 22, 2004 4:49 pm

Re: Ускорение вычислений суперпозиции импульсов

Сообщение sandy » Вс дек 20, 2015 5:14 pm

И каким же образом я могу посчитать дисперсию и мат. ожидание без расчета всего сигнала?

Ваш сигнал представляет собой сумму импульсов одинаковой формы, статистические свойства их амплитуд и распределения во времени известны. Математическое ожидание и дисперсия рассчитываются исходя из этой математической модели.
Массив с импульсом для 60-секундной записи будет содержать меньшее количество точек, чем обычно.

Эта фраза непонятна.
С уважением



Александр Сергиенко