예제 #1
0
int main( int argc, char *argv[] )
{
    benchmarks_t *bm = NULL;
    enum bm_type_t bmt;

    bmt = ia32_cpu_type();
    switch (bmt) {
    case BMT_P4:
        printf( "Pentium 4 detected, enabling P4 performance monitoring.\n" );
        bm = &p4_benchmarks;
        break;
    case BMT_K8:
        printf( "AMD K8 detected, enabling K8 performance monitoring.\n" );
        bm = &k8_benchmarks;
        break;
    default:
        printf( "Unknown CPU type, performance monitoring disabled\n" );
    }

    perfmon_start(bm);
    if( argc > 1 )
        system( argv[1] );
    perfmon_stop(bm);

    perfmon_print(bm);

    return 0;
}
예제 #2
0
int main( int argc, char *argv[] )
{
    enum bm_type_t bmt;
    unsigned total_time = 60, sample_period = 20;
    unsigned int i;

    bmt = ia32_cpu_type();
    switch (bmt) {
	case BMT_P4:
	    printf( "Pentium 4 detected, enabling P4 performance monitoring.\n" );
	    bm = &p4_benchmarks;
	    break;
	case BMT_K8:
	    printf( "AMD K8 detected, enabling K8 performance monitoring.\n" );
	    bm = &k8_benchmarks;
	    break;
	default:
	    printf( "Unknown CPU type, performance monitoring disabled\n" );
    }

    if( argc > 1 )
	sscanf( argv[1], "%u", &sample_period );
    if( argc > 2 )
	sscanf( argv[2], "%u", &total_time );

    if( signal(SIGINT, sigint_handler) == SIG_ERR ) {
	printf( "Error installing the signal handler.\n" );
	exit( 1 );
    }

    tot_samples = total_time / sample_period;
    sample_width = bm->size + 1;
    samples = malloc( sizeof(unsigned long long) * sample_width * tot_samples );
    if( samples == NULL ) {
	printf( "Error allocating memory.\n" );
	exit( 1 );
    }

    for( next_sample = 0; next_sample < tot_samples; next_sample++ )
    {
	perfmon_start(bm);
	sleep( sample_period );
	perfmon_stop(bm);

	samples[next_sample*sample_width + 0] = bm->tsc;
	for( i = 0; i < bm->size; i++ )
	    samples[next_sample*sample_width + 1 + i] = bm->benchmarks[i].counter;
    }

    signal( SIGINT, SIG_DFL );
    dumper();

    return 0;
}
예제 #3
0
/**
 * opd_do_read - enter processing loop
 * @param buf  buffer to read into
 * @param size  size of buffer
 *
 * Read some of a buffer from the device and process
 * the contents.
 */
static void opd_do_read(char * buf, size_t size)
{
	opd_open_pipe();

	while (1) {
		ssize_t count = -1;

		/* loop to handle EINTR */
		while (count < 0) {
			count = op_read_device(devfd, buf, size);

			/* we can lose an alarm or a hup but
			 * we don't care.
			 */
			if (signal_alarm) {
				signal_alarm = 0;
				opd_alarm();
			}

			if (signal_hup) {
				signal_hup = 0;
				opd_sighup();
			}

			if (signal_term)
				opd_sigterm();

			if (signal_child)
				opd_sigchild();

			if (signal_usr1) {
				signal_usr1 = 0;
				perfmon_start();
			}

			if (signal_usr2) {
				signal_usr2 = 0;
				perfmon_stop();
			}

			if (is_jitconv_requested()) {
				verbprintf(vmisc, "Start opjitconv was triggered\n");
				opd_do_jitdumps();
			}
		}

		opd_do_samples(buf, count);
	}
	
	opd_close_pipe();
}
예제 #4
0
/**
 * opd_do_read - enter processing loop
 * @param buf  buffer to read into
 * @param size  size of buffer
 *
 * Read some of a buffer from the device and process
 * the contents.
 */
static void opd_do_read(char * buf, size_t size)
{
	while (1) {
		ssize_t count = -1;

		/* loop to handle EINTR */
		while (count < 0) {
			count = op_read_device(devfd, buf, size);

			/* we can lose an alarm or a hup but
			 * we don't care.
			 */
			if (signal_alarm) {
				signal_alarm = 0;
				opd_alarm();
			}

			if (signal_hup) {
				signal_hup = 0;
				opd_sighup();
			}

			if (signal_term)
				opd_sigterm();

			if (signal_usr1) {
				signal_usr1 = 0;
				perfmon_start();
			}

			if (signal_usr2) {
				signal_usr2 = 0;
				perfmon_stop();
			}
		}

		opd_do_samples(buf, count);
	}
}
예제 #5
0
int main( int argc, char *argv[] )
{
    int dev_fd;
    char *device_name;
    char *buffer = (char *)((unsigned long)(buffer_space + MAX_BLOCK_SIZE) & MAX_BLOCK_MASK);
    unsigned long device_size;
    unsigned block_size, block_count, block;
    int err, i;
    benchmarks_t *bm;

    if( argc < 2 )
	usage(argv[0]);
    device_name = argv[1];

    // Init the performance counters.
    bm = perfmon_arch_init();
    if( NULL == bm )
	exit( 1 );

    // Open the device with *raw* access.
    dev_fd = open( device_name, O_RDWR | O_DIRECT, 0 );
    if( dev_fd == -1 ) {
	fprintf( stderr, "Unable to open '%s': %s.\n",
		device_name, strerror(errno) );
	exit( 1 );
    }

    // Choose the number of blocks we want.
    device_size = 1UL*1024UL*1024UL*1024UL;
    block_count = device_size / (MAX_BLOCK_SIZE * MAX_IOVEC);

    // Init the iovec array.
    for( i = 0; i < MAX_IOVEC; i++ )
	iovec[i].iov_base = buffer;

    // Print the headers.
    printf( "type,syscalls,block_size,iovecs," );
    perfmon_print_headers(bm);
    fflush(stdout);

    // Perform the read experiment.
    for( block_size = MIN_BLOCK_SIZE; block_size <= MAX_BLOCK_SIZE; block_size *= 2 )
    {
	if( lseek(dev_fd, 0, SEEK_SET) != 0 ) {
	    fprintf( stderr, "Seek error on '%s': %s.\n",
		    device_name, strerror(errno) );
	    exit( 1 );
	}

	for( i = 0; i < MAX_IOVEC; i++ )
	    iovec[i].iov_len = block_size;

	block_count = device_size / (block_size * MAX_IOVEC);

	printf( "read,%lu,%u,%u,", block_count, block_size, MAX_IOVEC );
	fflush(stdout);
	perfmon_start(bm);
	for( block = 0; block < block_count; block++ )
	{
    	    err = readv(dev_fd, iovec, MAX_IOVEC);
    	    if( err < 0 ) {
    		fprintf( stderr, "Read error on '%s': %s.\n",
    			device_name, strerror(errno) );
    		exit( 1 );
    	    }
       	}
	perfmon_stop(bm);
	perfmon_print_data(bm);
    }

    // Perform the write experiment.
    for( block_size = MIN_BLOCK_SIZE; block_size <= MAX_BLOCK_SIZE; block_size *= 2 )
    {
	if( lseek(dev_fd, 0, SEEK_SET) != 0 ) {
	    fprintf( stderr, "Seek error on '%s': %s.\n",
		    device_name, strerror(errno) );
	    exit( 1 );
	}

	for( i = 0; i < MAX_IOVEC; i++ )
	    iovec[i].iov_len = block_size;

	block_count = device_size / (block_size * MAX_IOVEC);

	printf( "write,%lu,%u,%u,", block_count, block_size, MAX_IOVEC );
	fflush(stdout);
	perfmon_start(bm);
	for( block = 0; block < block_count; block++ )
	{
	    err = writev(dev_fd, iovec, MAX_IOVEC);
	    if( err < 0 ) {
		fprintf( stderr, "Write error on '%s': %s.\n",
			device_name, strerror(errno) );
		exit( 1 );
	    }
	}
	perfmon_stop(bm);
	perfmon_print_data(bm);
    }

    close( dev_fd );
}