Информация об изменениях

Сообщение Re[2]: распараллеливание и ресурсоёмкость от 16.04.2019 11:08

Изменено 16.04.2019 12:07 vvv848165@ya.ru

Re[2]: распараллеливание и ресурсоёмкость
Здравствуйте, Sinclair, Вы писали:


S>Непонятно, куда передавать. Непонятно, что такое fs[ic], и почему в Next нужно передавать ref double[].

ссылку в лямда выражение (она просто так не передаётся)
а что с ref double[]?
S>Для начала проверьте, что код делает то, что нужно, а не генерирует мусор.
код отлажен и проверен ...
no_channel — от 8 до 16 (процессор 4х ядерный)
src.LongLength = 8192

public void Init(string[] names)
{
no_channel = names.Length;
fs = new FilterSections[no_channel];
gain = new double[no_channel];

for (int i = 0; i < no_channel; i++)
{
fs[i] = new FilterSections();
gain[i] = 1.0d;
Coeff coeff = FilterCoefficient.GetCoefficients(names[i]);
fs[i].Init(coeff);
}
}

class FilterSections
{
private Filter[] filters = null;
private int no_filtres = 0;

public FilterSections()
{
}

public void Init(Coeff coef)
{
no_filtres=coef.no_filtres;
filters = new Filter[no_filtres];

for (int i = 0; i < no_filtres; i++)
filters[i] = new Filter();

for (int i = 0; i < no_filtres; i++)
filters[i].Init(coef.pre_gain[i], coef.DEN[i * 2 + 0], coef.DEN[i * 2 + 1],coef.NUM[i]);
}
public void Next(ref double[] y, double[] x)
{
int no=x.Length;
double[] val = new double[no];

for (int j = 0; j < no; j++)
val[j] = x[j];

for (int i = 0; i < no_filtres; i++)
filters[i].Next(ref val, val);

for (int j = 0; j < no; j++)
y[j] = val[j];

/*
int no_filtres_m_1 = no_filtres — 1;
filters[0].Next(ref val, x);
for (int i = 1; i < no_filtres_m_1; i++)
filters[i].Next(ref val, val);
filters[no_filtres_m_1].Next(ref y, val);
*/
}
}

public class Filter
{
private double v1 = 0.0d, v2 = 0.0d;
private double pregain, a2, a3, b2;

public Filter()
{
}

public void Init(double _pregain, double _a2, double _a3, double _b2)
{
pregain = _pregain; a2 = _a2; a3 = _a3; b2 = _b2;
}

public void Next(ref double[] y, double[] x)
{
for (long i = 0; i < x.LongLength; i++)
{
double v0 = pregain * x[i] — a2 * v1 — a3 * v2;
y[i] = v0 + b2 * v1 + v2;

v2 = v1; v1 = v0;
}
}
}
Re[2]: распараллеливание и ресурсоёмкость
Здравствуйте, Sinclair, Вы писали:


S>Непонятно, куда передавать. Непонятно, что такое fs[ic], и почему в Next нужно передавать ref double[].

ссылку в лямда выражение (она просто так не передаётся)
а что с ref double[]?
S>Для начала проверьте, что код делает то, что нужно, а не генерирует мусор.
код отлажен и проверен ...
no_channel — от 8 до 16 (процессор 4х ядерный)
src.LongLength = 8192

public void Init(string[] names)
        {
            no_channel = names.Length;
            fs = new FilterSections[no_channel];
            gain = new double[no_channel];

            for (int i = 0; i < no_channel; i++)
            {
                fs[i] = new FilterSections();
                gain[i] = 1.0d;
                Coeff coeff = FilterCoefficient.GetCoefficients(names[i]);
                fs[i].Init(coeff);
            }
        }     

class FilterSections
    {
        private Filter[] filters = null;
        private int no_filtres = 0;

        public FilterSections()
        { 
        }

        public void Init(Coeff coef) 
        {
            no_filtres=coef.no_filtres;
            filters = new Filter[no_filtres];

            for (int i = 0; i < no_filtres; i++)
                filters[i] = new Filter();

            for (int i = 0; i < no_filtres; i++)
                filters[i].Init(coef.pre_gain[i], coef.DEN[i * 2 + 0], coef.DEN[i * 2 + 1],coef.NUM[i]);
        }
        public void Next(ref double[] y, double[] x)
        {
            int no=x.Length;
            double[] val = new double[no];
            
            for (int j = 0; j < no; j++)
                val[j] = x[j];

            for (int i = 0; i < no_filtres; i++)
                filters[i].Next(ref val, val);
            
            for (int j = 0; j < no; j++)
                y[j] = val[j];
            
            /*
            int no_filtres_m_1 = no_filtres - 1;
            filters[0].Next(ref val, x);
            for (int i = 1; i < no_filtres_m_1; i++)
                filters[i].Next(ref val, val);
            filters[no_filtres_m_1].Next(ref y, val);
             */
        }
    }

public class Filter
    {
        private double v1 = 0.0d, v2 = 0.0d;
        private double pregain, a2, a3, b2;

        public Filter()
        {
        }

        public void Init(double _pregain, double _a2, double _a3, double _b2)
        {
            pregain = _pregain; a2 = _a2; a3 = _a3; b2 = _b2;
        }

        public void Next(ref double[] y, double[] x)
        {
            for (long i = 0; i < x.LongLength; i++)
            {
                double v0 = pregain * x[i] - a2 * v1 - a3 * v2;
                y[i] = v0 + b2 * v1 + v2;

                v2 = v1; v1 = v0;
            }
        }
    }