diff options
Diffstat (limited to 'bitfield.c')
-rw-r--r-- | bitfield.c | 80 |
1 files changed, 41 insertions, 39 deletions
@@ -14,9 +14,15 @@ ** BITFIELD OPERATIONS ** *************************/ -static clock_t DoBitfieldIteration(unsigned long *bitarraybase, - unsigned long *bitoparraybase, - long bitoparraysize, +#ifdef _LP64 +#define ARRAY_SIZE 16384L +#else +#define ARRAY_SIZE 32768L +#endif + +static clock_t DoBitfieldIteration(unsigned long *bitarray, + unsigned long *bitoparray, + long bitop_array_size, unsigned long *nbitops); static void ToggleBitRun(unsigned long *bitmap, unsigned long bit_addr, @@ -37,32 +43,28 @@ DoBitops(void) { const char* context = "CPU:Bitfields"; BitOpStruct* locbitopstruct = &global_bitopstruct; - unsigned long* bitarraybase = NULL; - unsigned long* bitoparraybase = NULL; + unsigned long* bitarray = NULL; + unsigned long* bitoparray = NULL; clock_t total_time = 0; int iterations = 0; unsigned long nbitops; static int is_adjusted = FALSE; + static int bitop_array_size = 30; if (is_adjusted == FALSE) { is_adjusted = TRUE; - bitarraybase = realloc(bitarraybase, locbitopstruct->bitfieldarraysize * sizeof(unsigned long)); - if (!bitarraybase) { + bitarray = realloc(bitarray, ARRAY_SIZE * sizeof(unsigned long)); + if (!bitarray) { fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); exit(1); } - /* - ** Initialize bitfield operations array to [2,30] elements - */ - locbitopstruct->bitoparraysize = 30L; - while(1) { - bitoparraybase = malloc(locbitopstruct->bitoparraysize * 2 * sizeof(unsigned long)); - if (!bitoparraybase) { + bitoparray = malloc(bitop_array_size * 2 * sizeof(unsigned long)); + if (!bitoparray) { fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); - free(bitarraybase); + free(bitarray); exit(1); } @@ -72,27 +74,27 @@ DoBitops(void) ** minimum, then de-allocate the array, reallocate a ** larger version, and try again. */ - if(DoBitfieldIteration(bitarraybase, bitoparraybase, locbitopstruct->bitoparraysize, &nbitops) > MINIMUM_TICKS) { + if(DoBitfieldIteration(bitarray, bitoparray, bitop_array_size, &nbitops) > MINIMUM_TICKS) { break; } - locbitopstruct->bitoparraysize += 100L; + bitop_array_size += 100; } } else { /* ** Don't need to do self adjustment, just allocate ** the array space. */ - bitarraybase = malloc(locbitopstruct->bitfieldarraysize * sizeof(unsigned long)); - if (!bitarraybase) { + bitarray = malloc(ARRAY_SIZE * sizeof(unsigned long)); + if (!bitarray) { fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); exit(1); } - bitoparraybase = malloc(locbitopstruct->bitoparraysize * 2 * sizeof(unsigned long)); - if (!bitoparraybase) { + bitoparray = malloc(bitop_array_size * 2 * sizeof(unsigned long)); + if (!bitoparray) { fprintf(stderr, "Error in %s, could not allocate memory. Exitting...\n", context); - free(bitarraybase); + free(bitarray); exit(1); } } @@ -102,7 +104,7 @@ DoBitops(void) ** accumulated elapsed time is greater than # of seconds requested. */ do { - total_time += DoBitfieldIteration(bitarraybase, bitoparraybase, locbitopstruct->bitoparraysize,&nbitops); + total_time += DoBitfieldIteration(bitarray, bitoparray, bitop_array_size,&nbitops); iterations += nbitops; } while (total_time < MINIMUM_SECONDS * CLOCKS_PER_SEC); @@ -111,8 +113,8 @@ DoBitops(void) ** Also, set adjustment flag to show that we don't have ** to do self adjusting in the future. */ - free(bitarraybase); - free(bitoparraybase); + free(bitarray); + free(bitoparray); locbitopstruct->results = (double)(iterations * CLOCKS_PER_SEC) / (double)total_time; } @@ -124,7 +126,7 @@ DoBitops(void) ** Return the # of ticks accumulated by the operation. */ static clock_t -DoBitfieldIteration(unsigned long *bitarraybase, unsigned long *bitoparraybase, long bitoparraysize, unsigned long *nbitops) +DoBitfieldIteration(unsigned long *bitarray, unsigned long *bitoparray, long bitop_array_size, unsigned long *nbitops) { clock_t start, stop; long i; @@ -152,37 +154,37 @@ DoBitfieldIteration(unsigned long *bitarraybase, unsigned long *bitoparraybase, */ randnum(13); - for (i = 0; i < global_bitopstruct.bitfieldarraysize; i++) { + for (i = 0; i < ARRAY_SIZE; i++) { #ifdef _LP64 - *(bitarraybase+i) = 0x5555555555555555UL; + *(bitarray+i) = 0x5555555555555555UL; #else - *(bitarraybase+i) = 0x55555555UL; + *(bitarray+i) = 0x55555555UL; #endif } randnum(13); - for (i = 0; i < bitoparraysize; i++) { + for (i = 0; i < bitop_array_size; i++) { /* First item is offset */ - *(bitoparraybase + i + i) = bitoffset = abs_randwc((int32_t)262140); + *(bitoparray + i + i) = bitoffset = abs_randwc((int32_t)262140); /* Next item is run length */ - *nbitops += *(bitoparraybase + i + i + 1L) = abs_randwc((int32_t)262140 - bitoffset); + *nbitops += *(bitoparray + i + i + 1L) = abs_randwc((int32_t)262140 - bitoffset); } start = clock(); - for(i = 0; i < bitoparraysize; i++) { + for(i = 0; i < bitop_array_size; i++) { switch(i % 3) { case 2: /* Complement run of bits */ - FlipBitRun(bitarraybase, - *(bitoparraybase+i+i), - *(bitoparraybase+i+i+1)); + FlipBitRun(bitarray, + *(bitoparray+i+i), + *(bitoparray+i+i+1)); break; default: - ToggleBitRun(bitarraybase, - *(bitoparraybase+i+i), - *(bitoparraybase+i+i+1), + ToggleBitRun(bitarray, + *(bitoparray+i+i), + *(bitoparray+i+i+1), !i); break; } |