// memcpy.c - Measure how fast we can copy memory #include #include #include #include /* timing function */ #define rdtscll(val) do { \ unsigned int a,d; \ asm volatile("rdtsc" : "=a" (a), "=d" (d)); \ (val) = ((unsigned long)a) | (((unsigned long)d)<<32); \ } while(0) int main(int argc, char *argv[]) { int cpu_rate, num_loops, block_size, block_size_lwords, i, j; unsigned char *send_block_p, *rcv_block_p; unsigned long start_time, end_time; float rate; unsigned long *s_p, *r_p; if (argc != 4) { fprintf(stderr, "Usage: %s \n", argv[0] ); return 1; } cpu_rate = atoi(argv[1]); num_loops = atoi(argv[2]); block_size = atoi(argv[3]); block_size_lwords = block_size / sizeof(unsigned long); block_size = sizeof(unsigned long) * block_size_lwords; send_block_p = malloc(block_size); rcv_block_p = malloc(block_size); if ((send_block_p == NULL) || (rcv_block_p == NULL)) { fprintf(stderr, "Malloc failed to allocate block(s) of size %d.\n", block_size); } // start_time = clock(); rdtscll(start_time); for (i = 0; i < num_loops; i++) { memcpy(rcv_block_p, send_block_p, block_size); // s_p = (unsigned long *) send_block_p; // r_p = (unsigned long *) rcv_block_p; // // for (j = 0 ; j < block_size_lwords; j++) { // *(r_p++) = *(s_p++); // } } // end_time = clock(); rdtscll(end_time); rate = (float) (block_size) * (float) (num_loops) / ((float) (end_time - start_time)) * ((float) cpu_rate) * 1.0E6 / 1.0E6; fprintf(stdout, "Memory to memory copy rate = %f MBytes / sec. Block size = %d.\n", rate, block_size); } /* end main() */