Application Notes for oneMKL Summary Statistics

ID 772991
Date 3/31/2023
Public
Document Table of Contents

Computing Minimum/Maximum Values

Use the VSL_SS_METHOD_FAST method to compute the minimum/maximum values in the datasets. The calculation is straightforward and follows the pattern of the example below:

#include "mkl_vsl.h"
 
#define DIM 3      /* dimension of the task */ 
#define N   1000   /* number of observations */
 
int main()
{
    VSLSSTaskPtr task;
    float x[DIM][N];  /* matrix of observations */
    float min_est[DIM], max_est[DIM];
    MKL_INT p, n, xstorage;
    int status;
  
    /* Parameters of the task and initialization */
    p = DIM;
    n = N;
    xstorage = VSL_SS_MATRIX_STORAGE_ROWS;
    for ( int i = 0; i < p; i++ ) min_est[i] = max_est[i] = x[i][0];
 
    /* Create a task */
    status = vslsSSNewTask( &task, &p, &n, &xstorage, (float*)x, 0, 0 );
 
    /* Initialize the task parameters */
    status = vslsSSEditTask( task, VSL_SS_ED_MIN, min_est );
    status = vslsSSEditTask( task, VSL_SS_ED_MAX, max_est );
 
    /* Compute the minimum and maximum values in observations */
    status = vslsSSCompute( task, VSL_SS_MIN|VSL_SS_MAX,
                                  VSL_SS_METHOD_FAST );
 
    /* Deallocate the task resources */
    status = vslSSDeleteTask( &task );
 
    return 0;
}

The size of the arrays to hold the minimum/maximum values should be sufficient for storing at least p values of each estimate, where p is the dimension of the task.

You can use the computation of these estimates to find the minimum/maximum values in the dataset available in blocks. In this case, the estimates computed for the previous data portion are used for processing the next block of the data array.

Before the first call to the Compute routine, initialize the initial values of the estimates with reasonable values, such as the values of the first observation.