// Helper function to keep code base small void gport_ima_bench(struct rusage *_start, struct rusage *_finish, unsigned long int *_num_iterations, unsigned int _n) { // initialize port gport p = gport_create(2*_n-1,sizeof(int)); int w[_n]; // external buffer for writing int r[_n]; // external buffer for reading unsigned long int i; // start trials: // write to port, read from port getrusage(RUSAGE_SELF, _start); for (i=0; i<(*_num_iterations); i++) { // producer: write data to port from external buffer gport_produce(p,(void*)w,_n); // consumer: read data from port to external buffer gport_consume(p,(void*)r,_n); } getrusage(RUSAGE_SELF, _finish); *_num_iterations *= _n; gport_destroy(p); }
// consumer uses indirect memory access void consumer_handler ( void *_ptr ) { gport p = (gport) _ptr; unsigned int i, n=0; int r[CONSUMER_SIZE_MAX]; unsigned int num_samples_remaining = NUM_SAMPLES_TOTAL; while (num_samples_remaining > 0) { // randomly choose consumer size unsigned int k = (rand() % CONSUMER_SIZE_MAX) + 1; if (k > num_samples_remaining) k = num_samples_remaining; printf(" consumer waiting for %u samples...\n", k); gport_consume(p,(void*)r, k); for (i=0; i<k; i++) printf(" %3u: %d\n", n++, r[i]); num_samples_remaining -= k; } printf(" consumer exiting thread\n"); pthread_exit(0); // exit thread }
void consumer_handler ( void *_ptr ) { gport p = (gport) _ptr; unsigned int i, j, n=0; int r[CONSUMER_SIZE]; int eom; for (i=0; i<10; i++) { printf(" consumer waiting for %u samples...\n", CONSUMER_SIZE); eom = gport_consume(p,(void*)r,CONSUMER_SIZE); if (eom) { printf("consumer received eom\n"); break; } for (j=0; j<CONSUMER_SIZE; j++) printf(" %3u: %d\n", n++, r[j]); } // give producer time to finish writing buffer, then broadcast eom usleep(300000); gport_signal_eom(p); printf(" consumer exiting thread\n"); pthread_exit(0); // exit thread }