server-side-compute/test/reduce-ngi.c

88 lines
2.5 KiB
C
Raw Normal View History

2019-08-20 14:54:18 +00:00
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
#include <stdint.h>
#include <stdbool.h>
#include <float.h>
2019-08-20 15:51:25 +00:00
#include <math.h>
2019-08-20 14:54:18 +00:00
#include <ngi.h>
/*
* This application applies the reduce operation using the server-side compute using NGI
*/
// read the data and reduce it
void reduce_data(int size){
FILE * file = fopen("data.bin", "rb");
2019-08-20 15:51:25 +00:00
float mx;
server_reduce(file, NGI_OP_MAX, NGI_TYPE_FLOAT, & mx, 0, size*sizeof(float));
printf("Maximum: %f\n", mx);
2019-08-20 14:54:18 +00:00
fclose(file);
2019-08-20 15:51:25 +00:00
}
// read the data and reduce it using the NGI emulation lib
void reduce_data_native(int size){
FILE * file = fopen("data.bin", "rb");
float mx;
ngi_reduce_stub(file, NGI_OP_MAX, NGI_TYPE_FLOAT, & mx, 0, size*sizeof(float));
printf("Maximum (Ngi Native): %f\n", mx);
fclose(file);
}
2019-08-20 14:54:18 +00:00
2019-08-20 15:51:25 +00:00
void reduce_min_func(int8_t * data_i, void * out_buff, size_t off, size_t size){
float * outf = (float*) out_buff;
float mx = *outf;
float * data = (float*) data_i;
for(size_t i=0; i < size/sizeof(float); i++){
mx = data[i] > mx ? data[i]: mx;
}
*outf = mx;
}
2019-08-20 14:54:18 +00:00
2019-08-20 15:51:25 +00:00
void reduce_minmax_func(int8_t * data_i, void * out_buff, size_t off, size_t size){
float * outf = (float*) out_buff;
float mi = outf[0];
float mx = outf[1];
float * data = (float*) data_i;
for(size_t i=0; i < size/sizeof(float); i++){
2019-08-20 14:54:18 +00:00
mx = data[i] > mx ? data[i]: mx;
2019-08-20 15:51:25 +00:00
mi = data[i] < mi ? data[i]: mi;
2019-08-20 14:54:18 +00:00
}
2019-08-20 15:51:25 +00:00
outf[0] = mi;
outf[1] = mx;
}
2019-08-20 14:54:18 +00:00
// alternative using an internal function
2019-08-20 15:51:25 +00:00
void reduce_data_func(int size){
FILE * file = fopen("data.bin", "rb");
float mx;
mx = -INFINITY;
server_reduce_any_func(file, reduce_min_func, &mx, sizeof(float), 0, size*sizeof(float));
2019-08-20 14:54:18 +00:00
printf("Maximum: %f\n", mx);
2019-08-20 15:51:25 +00:00
float minmax[2] = {INFINITY, -INFINITY};
server_reduce_any_func(file, reduce_minmax_func, minmax, 2* sizeof(float), 0, size*sizeof(float));
printf("Min/Max: %f - %f\n", minmax[0], minmax[1]);
fclose(file);
}
2019-08-20 14:54:18 +00:00
// alternative using an external library function shipped a s lib
void reduce_data_func_lib(int size){
FILE * file = fopen("data.bin", "rb");
float minmax[2] = {INFINITY, -INFINITY};
server_reduce_any_func_lib(file, "./libreduce-ngi-userlib.so", "reduce_minmax_func_external", minmax, 2* sizeof(float), 0, size*sizeof(float));
printf("Using the external library libreduce-ngi-userlib.so provided by the user: Min/Max: %f - %f\n", minmax[0], minmax[1]);
fclose(file);
}
2019-08-20 14:54:18 +00:00
int main(){
int size = 40;
2019-08-20 14:54:18 +00:00
reduce_data(size);
reduce_data_native(size);
2019-08-20 15:51:25 +00:00
reduce_data_func(size);
reduce_data_func_lib(size);
2019-08-20 14:54:18 +00:00
return 0;
}