#include #include #include extern void *memcpy(void *, const void *, size_t); int main() { unsigned char *s, *d; register unsigned long long start, finish, i; if(posix_memalign((void *)&s, 128, 4096)) { printf("failed\n"); goto end; } for(i = 32, j = 0; i > 0; i--, j += 128) { /* clear s from cache */ __dcbf(s+j); } if(posix_memalign((void *)&d, 128, 4096)) { printf("failed\n"); goto end; } for(i = 32, j = 0; i > 0; i--, j += 128) { /* clear d from cache */ __dcbf(s+j); } __dcbt(cpymem); /* prefetch memcpy */ __dcbt(cpymem+128); __dcbt(cpymem+256); __dcbt(cpymem+384); __dcbt(cpymem+512); __dcbt(cpymem+640); __dcbt(cpymem+768); __dcbt(cpymem+896); __dcbt(cpymem+1024); __dcbt(cpymem+1152); __dcbt(cpymem+1280); __dcbt(cpymem+1408); __dcbt(cpymem+1536); __dcbt(cpymem+1664); __dcbt(cpymem+1792); __dcbt(cpymem+1920); __dcbt(cpymem+2048); __dcbt(cpymem+2176); __dcbt(cpymem+2304); __dcbt(cpymem+2432); __sync(); start = __mftb(); memcpy(d, s, 4096); finish = __mftb(); printf("%lld\n", finish - start); free(s); free(d); end: return 0; }