Compare commits
7 Commits
46ee06406f
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 94167e05fd | |||
| 7177add4ce | |||
| 37d3340df9 | |||
| fcdaf41495 | |||
| cec0662e68 | |||
| ba31dd9f8c | |||
| f355ab2d25 |
@@ -1,2 +1,2 @@
|
||||
all:
|
||||
clang++ -g dasm.cpp -o dasm
|
||||
clang++ -g dasm.cc -o dasm
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
all:
|
||||
clang++ -g dasm.cpp -o dasm
|
||||
clang++ -g dasm.cc -o dasm
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
all:
|
||||
clang++ -g dasm.cpp -o dasm
|
||||
clang++ -g dasm.cc -o dasm
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
CC=clang++
|
||||
CFLAGS=-g -O0 -Wall -Wextra
|
||||
LIBS=-Wl,-rpath,./lib -L./lib -lsim86
|
||||
SRC=*.cpp
|
||||
SRC=*.cc
|
||||
OUT=sim86
|
||||
|
||||
all:
|
||||
|
||||
@@ -1,17 +1,17 @@
|
||||
mk_haversine_fscanf:
|
||||
clang++ -g cpp/fscanf.cpp cpp/haversine.cpp -o cpp/haverscan
|
||||
clang++ -g cpp/fscanf.cc cpp/haversine.cc -o cpp/haverscan
|
||||
|
||||
run_haversine_fscanf:
|
||||
cd ./cpp && ./haverscan
|
||||
|
||||
mk_haversine_strtok:
|
||||
clang++ -g cpp/strtok.cpp cpp/haversine.cpp -o cpp/haverstrtok
|
||||
clang++ -g cpp/strtok.cc cpp/haversine.cc -o cpp/haverstrtok
|
||||
|
||||
run_haversine_strtok:
|
||||
cd ./cpp && ./haverstrtok
|
||||
|
||||
mk_test:
|
||||
clang++ -g -lpthread cpp/test.cpp cpp/haversine.cpp -o cpp/test
|
||||
clang++ -g -lpthread cpp/test.cc cpp/haversine.cc -o cpp/test
|
||||
|
||||
run_test:
|
||||
cd ./cpp && ./test
|
||||
|
||||
1
haversine_02/.gitignore
vendored
1
haversine_02/.gitignore
vendored
@@ -4,6 +4,7 @@
|
||||
compile_commands.json
|
||||
count_and_distances
|
||||
pairs.json
|
||||
cache_test
|
||||
main
|
||||
genhavr
|
||||
prochavr
|
||||
|
||||
@@ -43,11 +43,11 @@ fi
|
||||
|
||||
|
||||
# GENERATOR
|
||||
GENSRC="./src/generator/gen_argparser.cpp \
|
||||
./src/generator/generator.cpp \
|
||||
./src/haversine.cpp \
|
||||
./src/point_types.cpp \
|
||||
./src/generator/main.cpp"
|
||||
GENSRC="./src/generator/gen_argparser.cc \
|
||||
./src/generator/generator.cc \
|
||||
./src/haversine.cc \
|
||||
./src/point_types.cc \
|
||||
./src/generator/main.cc"
|
||||
GENOUT=genhavr
|
||||
|
||||
(set -x ; $CXX $CFLAGS $GENSRC -o $GENOUT)
|
||||
@@ -64,10 +64,10 @@ JSONFLAGS="-c "
|
||||
JSON_BUILD_DIR=json_build
|
||||
|
||||
PROCSRC="./$JSON_BUILD_DIR/*.o \
|
||||
./src/haversine.cpp \
|
||||
./src/point_types.cpp \
|
||||
./src/processor/proc_argparser.cpp \
|
||||
./src/processor/main.cpp "
|
||||
./src/haversine.cc \
|
||||
./src/point_types.cc \
|
||||
./src/processor/proc_argparser.cc \
|
||||
./src/processor/main.cc "
|
||||
PROCOUT=prochavr
|
||||
|
||||
# MEMTESTER
|
||||
@@ -113,7 +113,7 @@ if [[ $BASIC_PROFILING == true ]] || [[ $FULL_PROFILING == true ]]; then
|
||||
cd ../
|
||||
|
||||
# REPETITION TESTING
|
||||
REPTESTSRC="./src/repetition_testing/*.cpp ./$PROF_BUILD_DIR/*.o $ASM_LIB"
|
||||
REPTESTSRC="./src/repetition_testing/*.cc ./$PROF_BUILD_DIR/*.o $ASM_LIB"
|
||||
REPTESTOUT=reptest
|
||||
|
||||
(set -x ; $CXX $CFLAGS $REPTESTFLAGS $REPTESTSRC -o $REPTESTOUT)
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define ARR_LEN(ARR) sizeof(ARR) / sizeof(*ARR)
|
||||
@@ -47,6 +48,8 @@ extern "C" void read_32x2_simd_offset(char *buffer, u64 size);
|
||||
extern "C" void read_32x2_simd_no_offset(char *buffer, u64 size);
|
||||
extern "C" void read_16x4_simd(char *buffer, u64 size);
|
||||
extern "C" void read_32x4_simd(char *buffer, u64 size);
|
||||
extern "C" void cache_test(char *buffer, u64 size, u64 mask);
|
||||
extern "C" void cache_test_unaligned(char *buffer, u64 size, u64 mask);
|
||||
|
||||
void test_fread(reptester *tester, alloc_type type);
|
||||
void test_read(reptester *tester, alloc_type type);
|
||||
@@ -89,6 +92,23 @@ void test_read_32x2_simd_offset(reptester *tester, alloc_type type);
|
||||
void test_read_32x2_simd_no_offset(reptester *tester, alloc_type type);
|
||||
void test_read_16x4_simd(reptester *tester, alloc_type type);
|
||||
void test_read_32x4_simd(reptester *tester, alloc_type type);
|
||||
void test_cache_test_16k(reptester *tester, alloc_type type);
|
||||
void test_cache_test_16k_unaligned(reptester *tester, alloc_type type);
|
||||
void test_cache_test_32k(reptester *tester, alloc_type type);
|
||||
void test_cache_test_32k_unaligned(reptester *tester, alloc_type type);
|
||||
void test_cache_test_64k(reptester *tester, alloc_type type);
|
||||
void test_cache_test_128k(reptester *tester, alloc_type type);
|
||||
void test_cache_test_256k(reptester *tester, alloc_type type);
|
||||
void test_cache_test_512k(reptester *tester, alloc_type type);
|
||||
void test_cache_test_1m(reptester *tester, alloc_type type);
|
||||
void test_cache_test_2m(reptester *tester, alloc_type type);
|
||||
void test_cache_test_4m(reptester *tester, alloc_type type);
|
||||
void test_cache_test_8m(reptester *tester, alloc_type type);
|
||||
void test_cache_test_16m(reptester *tester, alloc_type type);
|
||||
void test_cache_test_32m(reptester *tester, alloc_type type);
|
||||
void test_cache_test_64m(reptester *tester, alloc_type type);
|
||||
void test_cache_test_512m(reptester *tester, alloc_type type);
|
||||
void test_cache_test_full(reptester *tester, alloc_type type);
|
||||
u64 get_file_length(FILE *fp);
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
@@ -118,20 +138,20 @@ int main(int argc, char *argv[]) {
|
||||
read_cpu_timer(), // test_start_time
|
||||
|
||||
1, // current_run
|
||||
{
|
||||
UINT64_MAX, // min_time
|
||||
0, // max_time
|
||||
0, // avg_time
|
||||
0, // total_time
|
||||
},
|
||||
{
|
||||
0, // min_faults
|
||||
0, // max_faults
|
||||
0, // avg_faults
|
||||
0, // total_bytes
|
||||
0, // total_faults
|
||||
},
|
||||
{}, // results
|
||||
{
|
||||
UINT64_MAX, // min_time
|
||||
0, // max_time
|
||||
0, // avg_time
|
||||
0, // total_time
|
||||
},
|
||||
{
|
||||
0, // min_faults
|
||||
0, // max_faults
|
||||
0, // avg_faults
|
||||
0, // total_bytes
|
||||
0, // total_faults
|
||||
},
|
||||
{}, // results
|
||||
};
|
||||
// clang-format on
|
||||
|
||||
@@ -182,22 +202,58 @@ int main(int argc, char *argv[]) {
|
||||
// {{"READ 2x2", "READ 2x2 WITH MALLOC"}, test_read_2x2},
|
||||
// {{"READ 4x2", "READ 4x2 WITH MALLOC"}, test_read_4x2},
|
||||
// {{"READ 8x2", "READ 8x2 WITH MALLOC"}, test_read_8x2},
|
||||
{{"READ 4x2_simd", "READ 4x2_simd WITH MALLOC"}, test_read_4x2_simd},
|
||||
{{"READ 8x2_simd", "READ 8x2_simd WITH MALLOC"}, test_read_8x2_simd},
|
||||
{{"READ 16x2_simd", "READ 16x2_simd WITH MALLOC"}, test_read_16x2_simd},
|
||||
{{"READ 32x2_simd_offset", "READ 32x2_simd_offset WITH MALLOC"},
|
||||
test_read_32x2_simd_offset},
|
||||
{{"READ 32x2_simd_no_offset", "READ 32x2_simd_no_offset WITH MALLOC"},
|
||||
test_read_32x2_simd_no_offset},
|
||||
{{"READ 16x4_simd", "READ 16x4_simd WITH MALLOC"}, test_read_16x4_simd},
|
||||
{{"READ 32x4_simd", "READ 32x4_simd WITH MALLOC"}, test_read_32x4_simd},
|
||||
// {{"READ 4x2_simd", "READ 4x2_simd WITH MALLOC"}, test_read_4x2_simd},
|
||||
// {{"READ 8x2_simd", "READ 8x2_simd WITH MALLOC"}, test_read_8x2_simd},
|
||||
// {{"READ 16x2_simd", "READ 16x2_simd WITH MALLOC"},
|
||||
// test_read_16x2_simd},
|
||||
// {{"READ 32x2_simd_offset", "READ 32x2_simd_offset WITH MALLOC"},
|
||||
// test_read_32x2_simd_offset},
|
||||
// {{"READ 32x2_simd_no_offset", "READ 32x2_simd_no_offset WITH MALLOC"},
|
||||
// test_read_32x2_simd_no_offset},
|
||||
// {{"READ 16x4_simd", "READ 16x4_simd WITH MALLOC"},
|
||||
// test_read_16x4_simd},
|
||||
// {{"READ 32x4_simd", "READ 32x4_simd WITH MALLOC"},
|
||||
// test_read_32x4_simd},
|
||||
{{"CACHE TEST 16K", "CACHE TEST 16K WITH MALLOC"}, test_cache_test_16k},
|
||||
{{"CACHE TEST 16K UNALIGNED", "CACHE TEST 16K UNALIGNED WITH MALLOC"},
|
||||
test_cache_test_16k_unaligned},
|
||||
// {{"CACHE TEST 32K", "CACHE TEST 32K WITH MALLOC"},
|
||||
// test_cache_test_32k},
|
||||
// {{"CACHE TEST 64K", "CACHE TEST 64K WITH MALLOC"},
|
||||
// test_cache_test_64k},
|
||||
// {{"CACHE TEST 128K", "CACHE TEST 128K WITH MALLOC"},
|
||||
// test_cache_test_128k},
|
||||
// {{"CACHE TEST 256K", "CACHE TEST 256K WITH MALLOC"},
|
||||
// test_cache_test_256k},
|
||||
// {{"CACHE TEST 512K", "CACHE TEST 512K WITH MALLOC"},
|
||||
// test_cache_test_512k},
|
||||
// {{"CACHE TEST 1M", "CACHE TEST 1M WITH MALLOC"}, test_cache_test_1m},
|
||||
// {{"CACHE TEST 2M", "CACHE TEST 2M WITH MALLOC"}, test_cache_test_2m},
|
||||
// {{"CACHE TEST 4M", "CACHE TEST 4M WITH MALLOC"}, test_cache_test_4m},
|
||||
// {{"CACHE TEST 8M", "CACHE TEST 8M WITH MALLOC"}, test_cache_test_8m},
|
||||
// {{"CACHE TEST 16M", "CACHE TEST 16M WITH MALLOC"},
|
||||
// test_cache_test_16m},
|
||||
// {{"CACHE TEST 32M", "CACHE TEST 32M WITH MALLOC"},
|
||||
// test_cache_test_32m},
|
||||
// {{"CACHE TEST 64M", "CACHE TEST 64M WITH MALLOC"},
|
||||
// test_cache_test_64m},
|
||||
// {{"CACHE TEST 512M", "CACHE TEST 512M WITH MALLOC"},
|
||||
// test_cache_test_512m},
|
||||
// {{"CACHE TEST FULL", "CACHE TEST FULL WITH MALLOC"},
|
||||
// test_cache_test_full},
|
||||
};
|
||||
|
||||
tester.params.read_size = get_file_length(fp);
|
||||
tester.params.read_count = 1;
|
||||
tester.params.buffer = (char *)malloc(tester.params.read_size + 1);
|
||||
tester.params.buffer =
|
||||
(char *)mmap(NULL, tester.params.read_size + 1, PROT_READ | PROT_WRITE,
|
||||
MAP_ANON | MAP_SHARED | MAP_NORESERVE, -1, 0);
|
||||
memset(tester.params.buffer, 0, tester.params.read_size + 1);
|
||||
|
||||
for (u64 i = 0; i < tester.params.read_size; ++i) {
|
||||
tester.params.buffer[i] = (char)i;
|
||||
}
|
||||
|
||||
for (u64 i = 0; i < waves; ++i) {
|
||||
for (u64 j = 0; j < ARR_LEN(funcs); ++j) {
|
||||
for (u64 k = 0; k < ALLOC_TYPE_WITH_MALLOC; ++k) {
|
||||
@@ -208,7 +264,7 @@ int main(int argc, char *argv[]) {
|
||||
|
||||
fclose(fp);
|
||||
|
||||
free(tester.params.buffer);
|
||||
munmap(tester.params.buffer, tester.params.read_size + 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -586,7 +642,6 @@ void test_align63_loop(reptester *tester, alloc_type type) {
|
||||
}
|
||||
|
||||
void test_align75_loop(reptester *tester, alloc_type type) {
|
||||
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
@@ -612,7 +667,6 @@ void test_align75_loop(reptester *tester, alloc_type type) {
|
||||
}
|
||||
|
||||
void test_align90_loop(reptester *tester, alloc_type type) {
|
||||
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
@@ -1112,7 +1166,6 @@ void test_read_4x2_simd(reptester *tester, alloc_type type) {
|
||||
}
|
||||
|
||||
void test_read_8x2_simd(reptester *tester, alloc_type type) {
|
||||
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
@@ -1138,7 +1191,6 @@ void test_read_8x2_simd(reptester *tester, alloc_type type) {
|
||||
}
|
||||
|
||||
void test_read_16x2_simd(reptester *tester, alloc_type type) {
|
||||
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
@@ -1264,6 +1316,431 @@ void test_read_32x4_simd(reptester *tester, alloc_type type) {
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_16k(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0x3fff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_16k_unaligned(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test_unaligned(tester->params.buffer, total_size, 0x3fff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_32k(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0x7fff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_32k_unaligned(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test_unaligned(tester->params.buffer, total_size, 0x7fff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_64k(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0xffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_128k(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0x1ffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_256k(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0x3ffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_512k(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0x7ffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_1m(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0xfffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_2m(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0x1fffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_4m(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0x3fffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_8m(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0x7fffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_16m(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0xffffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_32m(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0x1ffffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_64m(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0x3ffffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_512m(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0x1fffffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
void test_cache_test_full(reptester *tester, alloc_type type) {
|
||||
u64 start = read_cpu_timer();
|
||||
u64 fault_count_start = page_fault_count();
|
||||
|
||||
handle_alloc(tester, type);
|
||||
|
||||
u64 total_size = tester->params.read_size * tester->params.read_count;
|
||||
|
||||
cache_test(tester->params.buffer, total_size, 0xffffffffffffffff);
|
||||
|
||||
u64 fault_count_end = page_fault_count();
|
||||
u64 end = read_cpu_timer();
|
||||
|
||||
u64 read_time = end - start;
|
||||
u64 page_faults = fault_count_end - fault_count_start;
|
||||
|
||||
tester->results = {
|
||||
total_size,
|
||||
read_time,
|
||||
page_faults,
|
||||
};
|
||||
|
||||
handle_free(tester, type);
|
||||
}
|
||||
|
||||
u64 get_file_length(FILE *fp) {
|
||||
if (!fp) {
|
||||
return 0;
|
||||
@@ -36,459 +36,494 @@ global read_32x2_simd_offset
|
||||
global read_32x2_simd_no_offset
|
||||
global read_16x4_simd
|
||||
global read_32x4_simd
|
||||
global cache_test ; Expects 3 inputs (pointer, read_count, mask)
|
||||
global cache_test_unaligned ; Expects 3 inputs (pointer, read_count, mask)
|
||||
|
||||
mov_all_bytes_asm:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
.loop:
|
||||
mov BYTE [rdi + rax * 1], al
|
||||
inc rax
|
||||
cmp rsi, rax
|
||||
jne .loop
|
||||
.loop:
|
||||
mov BYTE [rdi + rax * 1], al
|
||||
inc rax
|
||||
cmp rsi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
nop_all_bytes_asm:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
.loop:
|
||||
db 0x0f, 0x1f, 0x00
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
.loop:
|
||||
db 0x0f, 0x1f, 0x00
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
nop_1x3_all_bytes_asm:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
.loop:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
.loop:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
nop_1x9_all_bytes_asm:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
.loop:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
.loop:
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
inc_all_bytes_asm:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
dec_all_bytes_asm:
|
||||
.loop:
|
||||
dec rdi
|
||||
jnz .loop
|
||||
.loop:
|
||||
dec rdi
|
||||
jnz .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
align64_loop:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
align 64
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
align1_loop:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
nop
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
align 64
|
||||
nop
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
align15_loop:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
%rep 15
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
align 64
|
||||
%rep 15
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
align31_loop:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
%rep 31
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
align 64
|
||||
%rep 31
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
align63_loop:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
%rep 63
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
align 64
|
||||
%rep 63
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
align75_loop:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
%rep 75
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
align 64
|
||||
%rep 75
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
align90_loop:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
%rep 90
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
align 64
|
||||
%rep 90
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
align112_loop:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
%rep 112
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
align 64
|
||||
%rep 112
|
||||
nop
|
||||
%endrep
|
||||
.loop:
|
||||
inc rax
|
||||
cmp rdi, rax
|
||||
jne .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
rat_add:
|
||||
mov rax, rdi
|
||||
mov rax, rdi
|
||||
|
||||
.loop:
|
||||
add rcx, 1
|
||||
add rcx, 1
|
||||
dec rax
|
||||
jnz .loop
|
||||
ret
|
||||
.loop:
|
||||
add rcx, 1
|
||||
add rcx, 1
|
||||
dec rax
|
||||
jnz .loop
|
||||
ret
|
||||
|
||||
rat_mov_add:
|
||||
mov rax, rdi
|
||||
mov rax, rdi
|
||||
|
||||
.loop:
|
||||
mov rcx, rax
|
||||
add rcx, 1
|
||||
mov rcx, rax
|
||||
add rcx, 1
|
||||
dec rax
|
||||
jnz .loop
|
||||
ret
|
||||
.loop:
|
||||
mov rcx, rax
|
||||
add rcx, 1
|
||||
mov rcx, rax
|
||||
add rcx, 1
|
||||
dec rax
|
||||
jnz .loop
|
||||
ret
|
||||
|
||||
read_1:
|
||||
align 64
|
||||
.loop:
|
||||
mov rax, [rdi]
|
||||
sub rsi, 1
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
mov rax, [rdi]
|
||||
sub rsi, 1
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_2:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov rax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov rax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_3:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 3
|
||||
mov rax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 3
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 3
|
||||
mov rax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 3
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_4:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 4
|
||||
mov rax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 4
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 4
|
||||
mov rax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 4
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_8:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 8
|
||||
mov rax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 8
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 8
|
||||
mov rax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 8
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
write_1:
|
||||
align 64
|
||||
.loop:
|
||||
mov QWORD [rdi], 0
|
||||
sub rsi, 1
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
mov QWORD [rdi], 0
|
||||
sub rsi, 1
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
write_2:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov QWORD [rdi], 0
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov QWORD [rdi], 0
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
write_3:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 3
|
||||
mov QWORD [rdi], 0
|
||||
%endrep
|
||||
sub rsi, 3
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 3
|
||||
mov QWORD [rdi], 0
|
||||
%endrep
|
||||
sub rsi, 3
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
write_4:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 4
|
||||
mov QWORD [rdi], 0
|
||||
%endrep
|
||||
sub rsi, 4
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 4
|
||||
mov QWORD [rdi], 0
|
||||
%endrep
|
||||
sub rsi, 4
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
write_8:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 8
|
||||
mov QWORD [rdi], 0
|
||||
%endrep
|
||||
sub rsi, 8
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 8
|
||||
mov QWORD [rdi], 0
|
||||
%endrep
|
||||
sub rsi, 8
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_1x2_low:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov al, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov al, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_1x2_high:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov ah, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov ah, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_2x2:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov ax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov ax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_4x2:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov eax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov eax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_8x2:
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov rax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
mov rax, [rdi]
|
||||
%endrep
|
||||
sub rsi, 2
|
||||
jnle .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_4x2_simd:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
.loop:
|
||||
mov r8d, [rdi]
|
||||
mov r8d, [rdi + 4]
|
||||
add rax, 8
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
align 64
|
||||
.loop:
|
||||
mov r8d, [rdi]
|
||||
mov r8d, [rdi + 4]
|
||||
add rax, 8
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_8x2_simd:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
.loop:
|
||||
mov r8, [rdi]
|
||||
mov r8, [rdi + 8]
|
||||
add rax, 16
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
align 64
|
||||
.loop:
|
||||
mov r8, [rdi]
|
||||
mov r8, [rdi + 8]
|
||||
add rax, 16
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_16x2_simd:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
.loop:
|
||||
vmovdqu xmm0, [rdi]
|
||||
vmovdqu xmm0, [rdi + 16]
|
||||
add rax, 32
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
align 64
|
||||
.loop:
|
||||
vmovdqu xmm0, [rdi]
|
||||
vmovdqu xmm0, [rdi + 16]
|
||||
add rax, 32
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_32x2_simd_offset:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
.loop:
|
||||
vmovdqu ymm0, [rdi]
|
||||
vmovdqu ymm0, [rdi + 32]
|
||||
add rax, 64
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
align 64
|
||||
.loop:
|
||||
vmovdqu ymm0, [rdi]
|
||||
vmovdqu ymm0, [rdi + 32]
|
||||
add rax, 64
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_32x2_simd_no_offset:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
.loop:
|
||||
vmovdqu ymm0, [rdi]
|
||||
vmovdqu ymm0, [rdi]
|
||||
add rax, 64
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
align 64
|
||||
.loop:
|
||||
vmovdqu ymm0, [rdi]
|
||||
vmovdqu ymm0, [rdi]
|
||||
add rax, 64
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_16x4_simd:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
vmovdqu xmm0, [rdi]
|
||||
vmovdqu xmm0, [rdi + 16]
|
||||
%endrep
|
||||
add rax, 64
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
vmovdqu xmm0, [rdi]
|
||||
vmovdqu xmm0, [rdi + 16]
|
||||
%endrep
|
||||
add rax, 64
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
read_32x4_simd:
|
||||
xor rax, rax
|
||||
xor rax, rax
|
||||
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
vmovdqu ymm0, [rdi]
|
||||
vmovdqu ymm0, [rdi]
|
||||
%endrep
|
||||
add rax, 128
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
align 64
|
||||
.loop:
|
||||
%rep 2
|
||||
vmovdqu ymm0, [rdi]
|
||||
vmovdqu ymm0, [rdi]
|
||||
%endrep
|
||||
add rax, 128
|
||||
cmp rax, rsi
|
||||
jb .loop
|
||||
|
||||
ret
|
||||
ret
|
||||
|
||||
cache_test:
|
||||
xor r10, r10 ; Zero loop counter
|
||||
mov rbx, rdi ; Save original pointer
|
||||
.loop:
|
||||
add rdi, r10 ; Advance the pointer
|
||||
add r10, 128 ; Increment loop counter
|
||||
and r10, rdx ; Mask offset
|
||||
vmovdqu ymm0, [rdi + 0]
|
||||
vmovdqu ymm1, [rdi + 32]
|
||||
vmovdqu ymm2, [rdi + 64]
|
||||
vmovdqu ymm3, [rdi + 96]
|
||||
mov rdi, rbx ; Restore original pointer
|
||||
sub rsi, 128 ; Decrement count
|
||||
ja .loop
|
||||
ret
|
||||
|
||||
cache_test_unaligned:
|
||||
xor r10, r10 ; Zero loop counter
|
||||
add rdi, 5 ; Unalign pointer
|
||||
mov rbx, rdi ; Save original pointer
|
||||
.loop:
|
||||
add rdi, r10 ; Advance the pointer
|
||||
add r10, 128 ; Increment loop counter
|
||||
and r10, rdx ; Mask offset
|
||||
vmovdqu ymm0, [rdi + 0]
|
||||
vmovdqu ymm1, [rdi + 32]
|
||||
vmovdqu ymm2, [rdi + 64]
|
||||
vmovdqu ymm3, [rdi + 96]
|
||||
mov rdi, rbx ; Restore original pointer
|
||||
sub rsi, 128 ; Decrement count
|
||||
ja .loop
|
||||
ret
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/resource.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
@@ -10,7 +11,9 @@ void handle_alloc(reptester *tester, alloc_type type) {
|
||||
switch (type) {
|
||||
case ALLOC_TYPE_WITH_MALLOC:
|
||||
if (!(tester->params.buffer)) {
|
||||
tester->params.buffer = (char *)malloc(tester->params.read_size + 1);
|
||||
tester->params.buffer = (char *)mmap(
|
||||
NULL, tester->params.read_size + 1, PROT_READ | PROT_WRITE,
|
||||
MAP_ANON | MAP_SHARED | MAP_NORESERVE, -1, 0);
|
||||
memset(tester->params.buffer, 0, tester->params.read_size + 1);
|
||||
}
|
||||
|
||||
@@ -24,7 +27,7 @@ void handle_free(reptester *tester, alloc_type type) {
|
||||
switch (type) {
|
||||
case ALLOC_TYPE_WITH_MALLOC:
|
||||
if (tester->params.buffer) {
|
||||
free(tester->params.buffer);
|
||||
munmap(tester->params.buffer, tester->params.read_size + 1);
|
||||
tester->params.buffer = NULL;
|
||||
}
|
||||
|
||||
@@ -58,7 +61,9 @@ void run_func_test(reptester *tester, reptest_func func, const char *func_name,
|
||||
|
||||
if (type == ALLOC_TYPE_WITH_MALLOC) {
|
||||
buffer = tester->params.buffer;
|
||||
tester->params.buffer = (char *)malloc(tester->params.read_size + 1);
|
||||
tester->params.buffer =
|
||||
(char *)mmap(NULL, tester->params.read_size + 1, PROT_READ | PROT_WRITE,
|
||||
MAP_ANON | MAP_SHARED | MAP_NORESERVE, -1, 0);
|
||||
memset(tester->params.buffer, 0, tester->params.read_size + 1);
|
||||
}
|
||||
|
||||
@@ -100,7 +105,7 @@ void run_func_test(reptester *tester, reptest_func func, const char *func_name,
|
||||
}
|
||||
|
||||
if (type == ALLOC_TYPE_WITH_MALLOC) {
|
||||
free(tester->params.buffer);
|
||||
munmap(tester->params.buffer, tester->params.read_size + 1);
|
||||
tester->params.buffer = buffer;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user