#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <time.h>
#include <netinet/ip6.h>
#include <immintrin.h>
#ifndef likely
#define likely(x) __builtin_expect(!!(x), 1)
#endif
#ifndef unlikely
#define unlikely(x) __builtin_expect(!!(x), 0)
#endif
static inline uint64_t rte_rdtsc(void)
{
union {
uint64_t tsc_64;
struct {
uint32_t lo_32;
uint32_t hi_32;
};
} tsc;
_mm_mfence();
asm volatile("rdtsc" :
"=a" (tsc.lo_32),
"=d" (tsc.hi_32));
return tsc.tsc_64;
}
#define ARRAY_LEN 2048
#define LOOP_CNT 1000
int array[ARRAY_LEN][ARRAY_LEN];
int cachetest2()
{
int i = 0;
int j = 0;
int nBlockWidth = 128 / sizeof(int) * 8;
int nBlocks = ARRAY_LEN / nBlockWidth;
int nRemain = ARRAY_LEN % nBlockWidth;
int sum_total = 0;
__m128i sum = _mm_setzero_si128();
__m128i load;
/* set array */
for (i = 0; i < ARRAY_LEN; i++) {
for (j = 0; j < ARRAY_LEN; j++) {
array[i][j] = rand() % 1024;
}
}
for (i = 0; i < ARRAY_LEN; i++) {
const __m128i *p = (const __m128i *)array[i];
for (j = 0; j < nBlocks; j++) {
load = _mm_load_si128(p);
sum = _mm_add_epi32(sum, load);
p++;
}
const int *q = (const int *)∑
sum_total += (q[0] + q[1] + q[2] + q[3]);
if (unlikely(nRemain)) {
for (j = 0; j < nRemain; j++) {
sum_total += q[j];
}
}
}
return sum_total;
}
int cachetest()
{
int i = 0;
int j = 0;
int sum = 0;
for (i = 0; i < ARRAY_LEN; i++) {
for (j = 0; j < ARRAY_LEN; j++) {
array[i][j] = rand() % 1024;
}
}
for (i = 0; i < ARRAY_LEN; i++) {
for (j = 0; j < ARRAY_LEN; j++) {
//sum += array[i][j];
sum += array[j][i];
}
}
return sum;
}
int main(void)
{
uint64_t start, end;
int i = 0;
srand((unsigned)time(NULL));
start = rte_rdtsc();
for (i = 0; i < LOOP_CNT; i++) {
cachetest();
}
end = rte_rdtsc();
printf("calc time: %ld\n", end - start);
return 0;
}