240 likes | 345 Views
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
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