240 likes | 351 Vues
This documentation explores the implementation of associative functions on the ClearSpeed CSX600, aimed at enhancing Automatic Train Control (ATC) applications. It discusses various function versions including Pure Cn, Assembler, and Mixed Cn/Assembler, along with detailed instructions for compilation and execution. Key functions like PickOne, AnyResponder, and MAX/MIN operations are demonstrated with example codes to illustrate their application in data handling. Performance timing and random data generation techniques are also covered, ensuring efficient processing in ATC systems.
E N D
Associative Functions implemented on ClearSpeed CSX600 Mike Yuan
Introduction • Important for ATC applications • asc.cn, asc.h, asc_asm.cn, carlot.h and carlot_n • Overview - PickOne: get, next - AnyResponder: any, ascNany - MAX/MIN: max_int, min_int, max_float, min_float • Three versions • Pure Cn (preferred): all functions in asc.cn • Assembler: max, min in asc_asm.cn • Mixed Cn and assembler: get, next, ascAny, ascNany in asc_asm.cn
Compile and run • For Cn versions -bash-3.00$ cscn -o test1.csx carlot_next.cn asc.cn -bash-3.00$ csrun test1.csx • For mixed and assembler versions -bash-3.00$ cscn -o test1.csx carlot_next.cn asc_asm.cn -bash-3.00$ csrun test1.csx
Get • Signature: mono short get (poly const char mask) • Return the first PE number of the enabled PEs
Get example codes //set the mask to only PE's with a 1991 model car. if (mycarlot.year == 1991) { mask = 1; } //get first car with the year 1991 ONE = get(mask); //set the ONE to color M if (get_penum() == ONE) { mycarlot.color = 'M'; }
Get results produced • Before: 1990 L F 1 1991 R H 1 1992 O T 0 • After: 1990 L F 1 1991 M H 1 1992 O T 0
Next • Signature: mono short next (poly const char mask, short ONE) • Return the PE number of the next PE in the mask
Next example codes //get NEXT car with 1991 year. ONE = next(mask,ONE); //set the second one to color N if (get_penum() == ONE) { mycarlot.color = 'N'; } //skip to the fourth carwith year 1991 ONE = next(mask,ONE); ONE = next(mask,ONE); //set the forth car with year 1991 to Z if (get_penum() == ONE) { mycarlot.color = 'Z'; }
Next results produced • Before: 1991 G D 1 19 91 L H 1 1991 Y D 1 • After: 1991 N D 1 1991 L H 1 1991 Z D 1
any • Signature: mono char any (poly int condition); • Test the condition condition on all of the enabled PEs and returns true if any of the enabled PEs return true
Example codes //set mask if (mycarlot.year == 1991) { mask = 1; } //turn off PE's not in mask if (mask) { //if there are any red and 1991 cars if(any(mycarlot.color == 'R')) { //all cars turn to color T mycarlot.color = 'T'; } }
any results • Before there is a: 1991 R D 1 • After 1991 T H 1 1991 T D 1 1991 T H 1
ascNany • Signature: mono char ascNany (poly int condition); • Test the condition condition on all of the enabled PEs and returns true if all of the enabled PEs return false
ascNany (cont) • Example codes: if(ascNany(mycarlot.color=='NONE')) { mycarlot.onlot = 0; } • Results 1991 T H 0 1991 T D 0 1991 T H 0
Max for int/float/short • Signature of max: int max_int(poly int value) • Return the maximum instance of a signed poly int value
Min for int/float/short • Signature of min: int min_int(poly int value) • Return the minimum instance of a signed poly int value
Max/Min (cont) • Example codes poly int index = get_penum(); int max_index, min_index; max_index = max_int(index); printf ("The maximum of PE number is: %d\n", max_index); min_index = min_int(index); printf ("The minimum of PE number is: %d\n", min_index); • Results The maximum of PE number is: 95 The minimum of PE number is: 0
Timing • Record cycles of operations • Example codes: // min_int start_time = get_cycles_ila(); min_int_result = min_int(int_value); elapsed_time = get_cycles_ila() - start_time; printf("min_int Result: %2d Time: %4u\n",min_int_result, elapsed_time);
Timing (cont) • Results: min_int Result: 0 Time: 6377 • run csreset -v and the frequency is displayed • Core clock frequency: Processor 0: 210.0 MHz, Processor 1: 210.0 MHz • 6377/210M=30.367 ms
Random function • Generate random data in PE • Randp() generates random numbers between 0 and RAND_MAX • Example codes: poly int rand_num = 0; rand_num = randp(); plane.speed[i] = (scale * (rand_num*(600.0 - 30.0)/RAND_MAX + 30));
Random number (cont) • Problem: average is median: (600-30)/2=285, not 250 • Use Poisson distribution or Weibu distribution to get average=250
Handle timer • Do timing in host for accuracy • Two semaphores sem_start, sem_end between host and PE • Host signals sem_start and records time • PE waits for it and then execute • PE signals sem_end • Host waits for sem_end
Handle timer (cont) • Host records time • How much time spent? • If > 0.5s, error • Else if< 0.5s, wait for rest of time
Task scheduling • One .csx file • A count for every 0.5s • If count=8, do terrain avoidance • If count=16, do conflict detection and correlation