Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
languagepy
titleTES Algorithm
linenumberstrue
collapsetrue
CreateCircularBuffers (NumberOfChannels,
SamplesPerWindow, TotalNumberOfWindows)
LoadFilters()
ConfigureDataChannel()

While IncomingData:
            LoadDatainBuffers()
            ApplyCrosstalkCorrection(All_Channels,CurrentWindow)

            EventMatrix = TagEvents(All_Channels)

	For each ActiveWindow : 
            WindowIncrement=+1
				Parfor each Channel:            
                	Switch (CheckEvents(EventMatrix)):
						Case No Event Before And After
						Energy = ApplyFilter(Filter00)
						Case Event Before And After
						Energy = ApplyFilter(Filter11)

						Case Event Before Only
						Energy = ApplyFilter(Filter10)

						Case Event After Only
						Energy = ApplyFilter(Filter00)


            SaveEnergyAndTimestamp(xtcFile)


		If WindowIncrement == SaveIncrement
			SaveWaveformtoXTC(xtcFile, TotalTimeWindow, AllChannels)


 


Def TagEvents:
	Parfor each channel : 
		If Slope > MinimumSlope:
			CurrentWindowEvent=True
		Else:
			CurrentWindowEvent=False
	
		EventMatrix(channel, currentWindowIndex) = CurrentWindowEvent
	Return EventMatrix

Def ApplyFilter(Filter):
	For each i, sample :
		Temp = linearFunction(sample) * sample 
		Tempsum1 = temp* Filter(i) 
		sum2 = sample*Filter2(i) %More filters added if necessary
		Energy = sum(temp)
		%Details on operations required for this step
		% Can we pipeline the linear function with the multiply and add?sum1+sum2

 

 

 

Benchmarks

This table lists the latest benchmarks.

Currently, it evaluates the average time (over 1e6 iterations) to complete the number of products indicated as well as the sum of the resulting vector. The length of the vector varies according to the number of samples.

For a fixed number of samples, the code uses if statements to directly indicates how many filters to use. For the code using the binary decision tree, the number of filters is passed as a prepocessor argument. Once we know how many filters are necessary this will become a fixed value. 

These benchmarks were obtained os psanagpu116, using O3 and vectored optimization. As a reference, 10 kHz operation gives a time window of 100 µs.

Code Block
languagebash
titleCompile flags
g++ -std=c++11 -O3 -DNDEBUG -march=native -IEigen main.cpp

 

All values are in μs.

Number of products

Number of samples

12345
1000.0610.0740.0910.108 
2000.1130.1450.1760.210 
3000.1500.1900.2410.296 
4000.2000.2660.3290.397 
5000.2390.3210.4020.486 
6000.2790.3780.4760.576 
7000.3180.4350.5490.667 
Decision tree0.0920.1170.1380.1610.203

 

Latest code :

Code Block
languagecpp
titleLatest version of code
linenumberstrue
collapsetrue
#include <iostream>
#include <Eigen/Dense>
#include <chrono>
#include <unistd.h>
using namespace Eigen;
using namespace std;
#define FILTERS 5
#define VERBOSE 1
#define REPEAT 1000
#define SAMPLESPEREVENT 100
#define MAXWINDOW 6
#define MAXSAMPLESIZE MAXWINDOW*SAMPLESPEREVENT
#define MAXFILTERS 5
#define NUMEVENTS 1000
int evaluate_energy(const ArrayXi samples, const ArrayXXi filters, int windowsize){
    ArrayXi temp(MAXSAMPLESIZE, 1);
    int size = SAMPLESPEREVENT*windowsize;
    temp = (samples.head(size) + ArrayXi::Constant(size,52)) * 50; // linear transformation
    //cout << filters.block(0,0,size,1) << endl;
    #if FILTERS == 1
    temp = temp * filters.topRows(size);
    #elif FILTERS == 2
    temp = temp * filters.topLeftCorner(size,1) * filters.block(0,1,size,1);
    #elif FILTERS == 3
    temp = temp * filters.topLeftCorner(size,1) * filters.block(0,1,size,1) * filters.block(0,2,size,1);
    #elif FILTERS == 4
    temp = temp * filters.topLeftCorner(size,1) * filters.block(0,1,size,1) * filters.block(0,2,size,1) * filters.block(0,3,size,1);
    #elif FILTERS == 5
    temp = temp * filters.topLeftCorner(size,1) * filters.block(0,1,size,1) * filters.block(0,2,size,1) * filters.block(0,3,size,1) * filters.block(0,4,size,1);
    #endif
    int sum = temp.sum();
    //int sum = 22;
    return sum;
}
int main(int argc, char** argv)
{
    ArrayXi samples = ArrayXi::Random(MAXSAMPLESIZE);
    ArrayXXi filters = ArrayXXi::Random(MAXSAMPLESIZE, FILTERS);
    ArrayXXf tempEvents = ArrayXXf::Random(1, NUMEVENTS);
    Array<bool, 1, NUMEVENTS> isEvent;
    isEvent = tempEvents > 0.5;
    int sum;
    auto t1 = std::chrono::high_resolution_clock::now();
    for (int repeat = 0; repeat<REPEAT; repeat++){
        for (int i = 4; i<NUMEVENTS; i++){
            if (isEvent(i) == true){
                if (isEvent(i-1) == true){
                    //use filter of length 2
                    sum = evaluate_energy(samples, filters, 2);
                    #if VERBOSE > 1
                    cout << isEvent.segment<6>(i-5) << " -- " << "2
Code Block
languagetext
titleOutput verfications
collapsetrue
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 1 1 1 -- 2 period filter used. The sum is 1637963934
0 0 1 1 1 1 -- 2 period filter used. The sum is 1637963934
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 1 0 1 1 -- 2 period filter used. The sum is 1637963934
1 0 1 1 0 1 -- 3 period filter used. The sum is 690148080
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 1 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 1 0 1 0 1 -- 3 period filter used. The sum is 690148080
1 0 1 0 1 1 -- 2 period filter used. The sum is 1637963934
0 1 0 1 1 1 -- 2 period filter used. The sum is 1637963934
0 1 1 1 0 1 -- 3 period filter used. The sum is 690148080
1 1 1 0 1 1 -- 2 period filter used. The sum is 1637963934
1 1 0 1 1 1 -- 2 period filter used. The sum is 1637963934
0 1 1 1 0 1 -- 3 period filter used. The sum is 690148080
1 1 0 1 0 1 -- 3 period filter used. The sum is 690148080
1 0 1 0 1 1 -- 2 period filter used. The sum is 1637963934
0 1 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
1" 0<< 0sum 0<< 1endl;
 1 -- 2 period filter used. The sum is 1637963934
0 0 0 0 0 1 -- Single period filter used.#endif
 The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The}
 sum is 357753622
0 0 1 0  0 1 -- 4 period filter used.  Theelse{
 sum is 357753622
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2if (isEvent(i-2) == true){
                    //use filter of length 3
                    sum = evaluate_energy(samples, filters, 3);
                    #if VERBOSE > 1
                    cout << isEvent.segment<6>(i-5) << " -- " << "3 period filter used. The sum is 1637963934
0 1 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
1 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 1 0 1 1 -- 2 period filter used. The sum is 1637963934
0 1 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single" << sum << endl;
                    #endif
                    }
                    else{
                        if (isEvent(i-3) == true){
                        //use filter of length 4
                        sum = evaluate_energy(samples, filters, 4);
                        #if VERBOSE > 1
                        cout << isEvent.segment<6>(i-5) << " -- " << "4 period filter used.  The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 1 0 1 1 -- 2 period filter used. The sum is 1637963934
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 1 0 1 1 -- 2 period filter used. The sum is 1637963934
0 1 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 1 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2" << sum  << endl;
                        #endif
                        }
                        else{
                            if (isEvent(i-4) == true){
                                //use filter of length 5
                                sum = evaluate_energy(samples, filters, 5);
                                #if VERBOSE > 1
                                cout << isEvent.segment<6>(i-5) << " -- " << "5 period filter used. The sum is 1637963934
1" 1<< 0sum 0 0<< 1endl;
 -- 5 period filter used. The sum is 558569752
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 0 0 0 0 1 -- Single period filter#endif
 used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 1 1 0 1 -- 3 period filter}
 used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filterelse{
 used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1   -- Single period filter used. The//use sumsingle isevent 67346722filter
0    0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
1 0sum 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 1 1 0 0 1 -- 4= evaluate_energy(samples, filters, 1);
                                #if VERBOSE > 1
                                cout << isEvent.segment<6>(i-5) << " -- " << "Single period filter used.  The sum is 357753622
1" 1<< 0sum 0 1<< 1endl;
 -- 2 period filter used. The sum     is 1637963934
0 1 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 0 0 0#endif
 1 -- Single period filter used. The sum is 67346722
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 0 0 0 0}
 1 -- Single period filter used. The sum is 67346722
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752}
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 1 0 1  }
                }
            }
        }
    }

    auto t2 = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> fp_ms = t2 - t1;
    #if VERBOSE > 0
    cout << "The sum is : " << sum << endl;
    cout << "The process took " << fp_ms.count() << "ms" << endl;
    #endif
  //Multiply vectors then sum the coefficients for inner product.
}

Code Block
languagetext
titleOutput verfications
collapsetrue
1 -- 2 period filter used. The sum is 1637963934
1 0 1 1 0 1 -- 3 period filter used. The sum is 690148080
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
10 0 10 0 0 1 -- 4Single period filter used.  The sum is 35775362267346722
0 0 0 01 0 1 -- Single3 period filter used. The sum is 67346722690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
10 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 10 0 01 1 -- 42 period filter used.  The sum is 3577536221637963934
0 0 0 1 01 0 1 -- 42 period filter used.  The sum is 3577536221637963934
0 0 01 01 01 1 -- Single2 period filter used. The sum is 673467221637963934
1 0 0 0 0 1 1 -- 2Single period filter used. The sum is 163796393467346722
10 0 0 01 0 1 -- Single3 period filter used. The sum is 67346722690148080
0 0 01 0 1 1 -- 2 period filter used. The sum is 1637963934
01 0 01 1 10 1 -- 23 period filter used. The sum is 1637963934690148080
10 1 10 0 0 1 -- 45 period filter used.  The sum is 357753622558569752
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 01 0 1 -- Single3 period filter used. The sum is 67346722690148080
01 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 0 0 0 10 1 1 -- 2Single period filter used. The sum is 163796393467346722
10 10 1 0 0 1 -- 4 period filter used.  The sum is 357753622
01 0 0 01 0 1 -- Single3 period filter used. The sum is 67346722690148080
0 01 0 01 0 1 -- Single3 period filter used. The sum is 67346722690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
1 0 0 1 0 0 1 -- 4Single period filter used.  The sum is 35775362267346722
0 10 0 0 10 1 -- 2Single period filter used. The sum is 163796393467346722
10 0 0 1 10 1 -- 23 period filter used. The sum is 1637963934690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 10 0 01 0 1 -- 53 period filter used. The sum is 558569752690148080
0 1 0 01 0 1 1 -- 23 period filter used. The sum is 1637963934690148080
01 0 01 0 01 1 -- Single2 period filter used. The sum is 673467221637963934
0 01 0 01 1 1 -- 2 period filter used. The sum is 1637963934
0 01 01 01 0 1 -- Single3 period filter used. The sum is 67346722690148080
01 1 01 0 1 0 1 -- 32 period filter used. The sum is 6901480801637963934
01 1 0 1 0 1 1 -- 2 period filter used. The sum is 1637963934
0 1 1 01 0 1 -- 43 period filter used.  The sum is 357753622690148080
1 01 0 1 0 1 -- 3 period filter used. The sum is 690148080
1 0 1 0 01 0 1 -- 52 period filter used. The sum is 5585697521637963934
0 01 01 0 0 1 -- Single4 period filter used.  The sum is 67346722357753622
0 1 0 0 1 0 1 -- 35 period filter used. The sum is 690148080558569752
1 0 10 0 1 0 1 -- 32 period filter used. The sum is 6901480801637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 1 0 1 -- 34 period filter used.  The sum is 690148080357753622
10 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
10 0 01 0 0 1 -- Single4 period filter used.  The sum is 67346722357753622
1 0 0 0 0 1 1 -- 2Single period filter used. The sum is 163796393467346722
0 0 01 0 0 1 -- Single4 period filter used.  The sum is 67346722357753622
0 0 0 0 10 1 -- 2Single period filter used. The sum is 163796393467346722
0 0 01 0 0 1 -- Single4 period filter used.  The sum is 67346722357753622
1 0 0 1 0 0 1 -- 43 period filter used.  The sum is 357753622690148080
10 0 0 10 0 1 -- 3Single period filter used. The sum is 69014808067346722
0 0 0 0 01 1 -- Single2 period filter used. The sum is 673467221637963934
0 1 01 0 0 1 -- 54 period filter used.  The sum is 558569752357753622
01 0 0 01 0 1 -- Single3 period filter used. The sum is 67346722690148080
0 0 0 0 10 1 -- 2Single period filter used. The sum is 163796393467346722
0 0 0 10 1 1 -- 2 period filter used. The sum is 1637963934
01 01 0 0 0 1 -- Single5 period filter used. The sum is 67346722558569752
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
1 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 10 0 0 1 -- 4Single period filter used.  The sum is 35775362267346722
0 0 01 0 0 1 -- Single4 period filter used.  The sum is 67346722357753622
1 0 0 01 0 1 1 -- 23 period filter used. The sum is 1637963934690148080
10 0 01 0 01 1 -- Single2 period filter used. The sum is 673467221637963934
0 01 01 0 0 1 -- Single4 period filter used.  The sum is 67346722357753622
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 10 0 0 1 -- 4Single period filter used.  The sum is 35775362267346722
0 10 0 0 1 1 -- 2 period filter used. The sum is 1637963934
10 0 0 10 10 1 -- 2Single period filter used. The sum is 163796393467346722
0 0 10 10 10 1 -- 2Single period filter used. The sum is 163796393467346722
10 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
1 0 0 0 1 0 1 -- 23 period filter used. The sum is 1637963934690148080
0 0 1 0 1 1 1 -- 2 period filter used. The sum is 1637963934
1 10 0 0 0 1 -- 5Single period filter used. The sum is 55856975267346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
10 0 10 0 0 1 -- 4Single period filter used.  The sum is 35775362267346722
0 0 01 0 0 1 -- Single4 period filter used.  The sum is 67346722357753622
1 0 0 01 0 1 1 -- 23 period filter used. The sum is 1637963934690148080
0 10 1 0 01 1 -- 42 period filter used.  The sum is 3577536221637963934
0 1 1 0 0 1 1 -- 24 period filter used.  The sum is 1637963934357753622
1 0 0 1 0 10 1 -- 24 period filter used.  The sum is 1637963934357753622
0 1 0 1 10 1 1 -- 2 period filter used. The sum is 1637963934
1 0 10 10 10 1 1 -- 2Single period filter used. The sum is 163796393467346722
10 10 10 10 1 1 -- 2 period filter used. The sum is 1637963934
1 1 10 10 10 1 -- 25 period filter used. The sum is 1637963934558569752
10 1 10 10 10 1 -- 25 period filter used. The sum is 1637963934558569752
10 10 10 10 10 1 -- 2Single period filter used. The sum is 163796393467346722
10 10 10 0 01 1 -- 42 period filter used.  The sum is 3577536221637963934
0 0 1 01 0 1 -- 43 period filter used.  The sum is 357753622690148080
10 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 10 1 -- 2Single period filter used. The sum is 163796393467346722
0 0 10 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 10 0 01 1 -- 42 period filter used.  The sum is 3577536221637963934
01 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
01 0 0 0 01 1 -- Single2 period filter used. The sum is 673467221637963934
1 01 0 0 0 1 -- Single5 period filter used. The sum is 67346722558569752
1 0 0 0 0 1 1 -- 2Single period filter used. The sum is 163796393467346722
10 10 0 0 0 1 -- 5Single period filter used. The sum is 55856975267346722
0 10 0 0 01 1 -- 52 period filter used. The sum is 5585697521637963934
0 1 01 0 0 1 1 -- 24 period filter used.  The sum is 1637963934357753622
01 1 0 0 1 1 1 -- 2 period filter used. The sum is 1637963934
10 1 1 0 0 1 -- 4 period filter used.  The sum is 357753622
10 10 0 0 10 1 -- 2Single period filter used. The sum is 163796393467346722
0 01 0 0 0 1 -- Single5 period filter used. The sum is 67346722558569752
0 0 10 0 0 1 -- 4Single period filter used.  The sum is 35775362267346722
0 1 0 1 0 0 1 -- 45 period filter used.  The sum is 357753622558569752
0 0 0 01 0 1 -- Single3 period filter used. The sum is 67346722690148080
0 0 01 0 1 1 -- 2 period filter used. The sum is 1637963934
01 0 01 1 10 1 -- 23 period filter used. The sum is 1637963934690148080
0 01 0 0 0 1 -- Single5 period filter used. The sum is 67346722558569752
0 0 0 10 0 1 -- 3Single period filter used. The sum is 69014808067346722
10 0 10 0 0 1 -- 4Single period filter used.  The sum is 35775362267346722
10 0 0 0 1 0 1 -- 32 period filter used. The sum is 6901480801637963934
0 0 10 0 10 1 -- 2Single period filter used. The sum is 163796393467346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
01 0 01 0 0 1 -- Single4 period filter used.  The sum is 67346722357753622
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
01 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 1 -- 24 period filter used.  The sum is 1637963934357753622
10 0 1 0 0 0 1 -- 54 period filter used.  The sum is 558569752357753622
0 0 0 10 0 1 -- 3Single period filter used. The sum is 69014808067346722
10 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 0 0 0 1 -- Single2 period filter used. The sum is 673467221637963934
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 01 1 -- Single2 period filter used. The sum is 673467221637963934
0 0 0 01 01 1 -- Single2 period filter used. The sum is 673467221637963934
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
1 0 0 0 0 1 -- Single4 period filter used.  The sum is 67346722357753622
0 0 10 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
The sum is : 690148080
The process took 11.03ms

 

 

Benchmarks

This table lists the latest benchmarks.

Currently, it evaluates the average time (over 1e6 iterations) to complete the number of products indicated as well as the sum of the resulting vector. The length of the vector varies according to the number of samples.

For a fixed number of samples, the code uses if statements to directly indicates how many filters to use. For the code using the binary decision tree, the number of filters is passed as a prepocessor argument. Once we know how many filters are necessary this will become a fixed value. 

These benchmarks were obtained os psanagpu116, using O3 and vectored optimization. As a reference, 10 kHz operation gives a time window of 100 µs.

Code Block
languagebash
titleCompile flags
g++ -std=c++11 -O3 -DNDEBUG -march=native -IEigen main.cpp

 

All values are in μs.

Number of products

Number of samples

12345
1000.0610.0740.0910.108 
2000.1130.1450.1760.210 
3000.1500.1900.2410.296 
4000.2000.2660.3290.397 
5000.2390.3210.4020.486 
6000.2790.3780.4760.576 
7000.3180.4350.5490.667 
Decision tree0.0920.1170.1380.1610.203

 

Latest code :

Code Block
languagecpp
titleLatest version of code
linenumberstrue
collapsetrue
#include <iostream>
#include <Eigen/Dense>
#include <chrono>
#include <unistd.h>
using namespace Eigen;
using namespace std;
#define FILTERS 5
#define VERBOSE 1
#define REPEAT 1000
#define SAMPLESPEREVENT 100
#define MAXWINDOW 6
#define MAXSAMPLESIZE MAXWINDOW*SAMPLESPEREVENT
#define MAXFILTERS 5
#define NUMEVENTS 1000
int evaluate_energy(const ArrayXi samples, const ArrayXXi filters, int windowsize){
    ArrayXi temp(MAXSAMPLESIZE, 1);
    int size = SAMPLESPEREVENT*windowsize;
    temp = (samples.head(size) + ArrayXi::Constant(size,52)) * 50; // linear transformation
    //cout << filters.block(0,0,size,1) << endl;
    #if FILTERS == 1
    temp = temp * filters.topRows(size);
    #elif FILTERS == 2
    temp = temp * filters.topLeftCorner(size,1) * filters.block(0,1,size,1);
    #elif FILTERS == 3
    temp = temp * filters.topLeftCorner(size,1) * filters.block(0,1,size,1) * filters.block(0,2,size,1);
    #elif FILTERS == 4
    temp = temp * filters.topLeftCorner(size,1) * filters.block(0,1,size,1) * filters.block(0,2,size,1) * filters.block(0,3,size,1);
    #elif FILTERS == 5
    temp = temp * filters.topLeftCorner(size,1) * filters.block(0,1,size,1) * filters.block(0,2,size,1) * filters.block(0,3,size,1) * filters.block(0,4,size,1);
    #endif
    int sum = temp.sum();
    //int sum = 22;
    return sum;
}
int main(int argc, char** argv)
{
    ArrayXi samples = ArrayXi::Random(MAXSAMPLESIZE);
    ArrayXXi filters = ArrayXXi::Random(MAXSAMPLESIZE, FILTERS);
    ArrayXXf tempEvents = ArrayXXf::Random(1, NUMEVENTS);
    Array<bool, 1, NUMEVENTS> isEvent;
    isEvent = tempEvents > 0.5;
    int sum;
    auto t1 = std::chrono::high_resolution_clock::now();
    for (int repeat = 0; repeat<REPEAT; repeat++){
        for (int i = 4; i<NUMEVENTS; i++){
            if (isEvent(i) == true){
                if (isEvent(i-1) == true){
                    //use filter of length 2
                    sum = evaluate_energy(samples, filters, 2);
                    #if VERBOSE > 1
                    cout << isEvent.segment<6>(i-5) << " -- " << " 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 1 1 1 -- 2 period filter used. The sum is 1637963934
1 1 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 1 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 0 0 1 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
1 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 1 0 1 1 -- 2 period filter used. The sum is 1637963934
0 1 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 1 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
1 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 1 1 1 -- 2 period filter used. The sum is " << sum << endl;
                    #endif
                }
                else{
                    if (isEvent(i-2) == true){
                    //use filter of length 3
                    sum = evaluate_energy(samples, filters, 3);
                    #if VERBOSE > 1
                    cout << isEvent.segment<6>(i-5) << " -- " << "3 1637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
1 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 1 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 0 0 1 1 1 -- 2 period filter used. The sum is 1637963934
0 0 1 1 1 1 -- 2 period filter used. The sum is " << sum << endl;
                    #endif
                    }
                    else{
                        if (isEvent(i-3) == true){
                        //use filter of length 4
                        sum = evaluate_energy(samples, filters, 4);
                        #if VERBOSE > 1
                        cout << isEvent.segment<6>(i-5) << " -- " << "4 1637963934
1 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
1 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 1 1 1 -- 2 period filter used. The sum is 1637963934
1 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
1 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 1 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 1 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 0 0 1 1 1 -- 2 period filter used. The sum is 1637963934
0 0 1 1 1 1 -- 2 period filter used. The sum is 1637963934
0 1 1 1 1 1 -- 2 period filter used. The sum is 1637963934
1 1 1 1 1 1 -- 2 period filter used.  The sum is "1637963934
1 <<1 sum1 1 <<1 endl;
1 -- 2 period filter used. The sum is 1637963934
1 1 1 1 1 1 -- 2 period filter used. The sum is  #endif1637963934
1 1 1 1     1 1 -- 2 period filter used. The sum is 1637963934
1 1 1 0 0 1 }
-- 4 period filter used.  The sum is 357753622
0 0 1 0 0 1 -- 4 period filter used.  The sum is else{357753622
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 if (isEvent(i-4) == true){
                                //use filter of length 5
                                sum = evaluate_energy(samples, filters, 5);
                                #if VERBOSE > 1
                                cout << isEvent.segment<6>(i-5) << " -- " << "50 1 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
1 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 1 1 1 -- 2 period filter used. The sum is " << sum  << endl;
                                #endif
                            }
                            else{
                                //use single event filter
                                sum = evaluate_energy(samples, filters, 1);
                                #if VERBOSE > 1
                                cout << isEvent.segment<6>(i-5) << " -- " << "1637963934
1 1 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 1 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 1 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
1 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 1 0 1 1 -- 2 period filter used. The sum is 1637963934
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is " << sum  << endl;
                                #endif
                            }
                        }
                    }
                }
            }
        }
    }

    auto t2 = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> fp_ms = t2 - t1;
    #if VERBOSE > 0
    cout << "The sum is : " << sum << endl;
    cout << "The process took " << fp_ms.count() << "ms" << endl;
    #endif
  //Multiply vectors then sum the coefficients for inner product.
}

...

67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 1 1 -- 2 period filter used. The sum is 1637963934
1 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
0 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
1 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 1 0 0 0 1 -- 5 period filter used. The sum is 558569752
1 0 0 0 0 1 -- Single period filter used. The sum is 67346722
0 0 1 0 0 1 -- 4 period filter used.  The sum is 357753622
1 0 0 1 0 1 -- 3 period filter used. The sum is 690148080
The sum is : 690148080
The process took 11.03ms

References

Ullom and Bennet. Review of superconducting transition sensors for X-ray and gamma-ray spectroscopy

...