Compare commits
15 Commits
297d9c53f3
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 94167e05fd | |||
| 7177add4ce | |||
| 37d3340df9 | |||
| fcdaf41495 | |||
| cec0662e68 | |||
| ba31dd9f8c | |||
| f355ab2d25 | |||
| 46ee06406f | |||
| 5c97a99839 | |||
| 2cb6f1beb6 | |||
| 4945a298ac | |||
| 063183e46c | |||
| 12f25cfe51 | |||
| 57acc5e16f | |||
| 43718ff047 |
@@ -1,2 +1,2 @@
|
|||||||
all:
|
all:
|
||||||
clang++ -g dasm.cpp -o dasm
|
clang++ -g dasm.cc -o dasm
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
all:
|
all:
|
||||||
clang++ -g dasm.cpp -o dasm
|
clang++ -g dasm.cc -o dasm
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
all:
|
all:
|
||||||
clang++ -g dasm.cpp -o dasm
|
clang++ -g dasm.cc -o dasm
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
CC=clang++
|
CC=clang++
|
||||||
CFLAGS=-g -O0 -Wall -Wextra
|
CFLAGS=-g -O0 -Wall -Wextra
|
||||||
LIBS=-Wl,-rpath,./lib -L./lib -lsim86
|
LIBS=-Wl,-rpath,./lib -L./lib -lsim86
|
||||||
SRC=*.cpp
|
SRC=*.cc
|
||||||
OUT=sim86
|
OUT=sim86
|
||||||
|
|
||||||
all:
|
all:
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
mk_haversine_fscanf:
|
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:
|
run_haversine_fscanf:
|
||||||
cd ./cpp && ./haverscan
|
cd ./cpp && ./haverscan
|
||||||
|
|
||||||
mk_haversine_strtok:
|
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:
|
run_haversine_strtok:
|
||||||
cd ./cpp && ./haverstrtok
|
cd ./cpp && ./haverstrtok
|
||||||
|
|
||||||
mk_test:
|
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:
|
run_test:
|
||||||
cd ./cpp && ./test
|
cd ./cpp && ./test
|
||||||
|
|||||||
1
haversine_02/.gitignore
vendored
1
haversine_02/.gitignore
vendored
@@ -4,6 +4,7 @@
|
|||||||
compile_commands.json
|
compile_commands.json
|
||||||
count_and_distances
|
count_and_distances
|
||||||
pairs.json
|
pairs.json
|
||||||
|
cache_test
|
||||||
main
|
main
|
||||||
genhavr
|
genhavr
|
||||||
prochavr
|
prochavr
|
||||||
|
|||||||
@@ -4,6 +4,12 @@ CC=clang
|
|||||||
CXX=clang++
|
CXX=clang++
|
||||||
CFLAGS="-Wall -Wextra -I$(realpath ./include) "
|
CFLAGS="-Wall -Wextra -I$(realpath ./include) "
|
||||||
|
|
||||||
|
ASM=nasm
|
||||||
|
ASM_FLAGS="-f elf64 "
|
||||||
|
|
||||||
|
AR=ar
|
||||||
|
AR_FLAGS="rcs"
|
||||||
|
|
||||||
# PARSE ARGUMENTS
|
# PARSE ARGUMENTS
|
||||||
# From this StackOverflow answer https://stackoverflow.com/a/14203146
|
# From this StackOverflow answer https://stackoverflow.com/a/14203146
|
||||||
while [[ $# > 0 ]];do
|
while [[ $# > 0 ]];do
|
||||||
@@ -30,18 +36,18 @@ done
|
|||||||
|
|
||||||
# BUILD TYPE
|
# BUILD TYPE
|
||||||
if [[ $RELEASE == true ]]; then
|
if [[ $RELEASE == true ]]; then
|
||||||
CFLAGS+="-O3"
|
CFLAGS+="-g -O1"
|
||||||
else
|
else
|
||||||
CFLAGS+="-g"
|
CFLAGS+="-g"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# GENERATOR
|
# GENERATOR
|
||||||
GENSRC="./src/generator/gen_argparser.cpp \
|
GENSRC="./src/generator/gen_argparser.cc \
|
||||||
./src/generator/generator.cpp \
|
./src/generator/generator.cc \
|
||||||
./src/haversine.cpp \
|
./src/haversine.cc \
|
||||||
./src/point_types.cpp \
|
./src/point_types.cc \
|
||||||
./src/generator/main.cpp"
|
./src/generator/main.cc"
|
||||||
GENOUT=genhavr
|
GENOUT=genhavr
|
||||||
|
|
||||||
(set -x ; $CXX $CFLAGS $GENSRC -o $GENOUT)
|
(set -x ; $CXX $CFLAGS $GENSRC -o $GENOUT)
|
||||||
@@ -58,10 +64,10 @@ JSONFLAGS="-c "
|
|||||||
JSON_BUILD_DIR=json_build
|
JSON_BUILD_DIR=json_build
|
||||||
|
|
||||||
PROCSRC="./$JSON_BUILD_DIR/*.o \
|
PROCSRC="./$JSON_BUILD_DIR/*.o \
|
||||||
./src/haversine.cpp \
|
./src/haversine.cc \
|
||||||
./src/point_types.cpp \
|
./src/point_types.cc \
|
||||||
./src/processor/proc_argparser.cpp \
|
./src/processor/proc_argparser.cc \
|
||||||
./src/processor/main.cpp "
|
./src/processor/main.cc "
|
||||||
PROCOUT=prochavr
|
PROCOUT=prochavr
|
||||||
|
|
||||||
# MEMTESTER
|
# MEMTESTER
|
||||||
@@ -71,6 +77,18 @@ MEMTESTOUT=memtest
|
|||||||
(set -x ; $CC $CFLAGS $MEMTESTSRC -o $MEMTESTOUT)
|
(set -x ; $CC $CFLAGS $MEMTESTSRC -o $MEMTESTOUT)
|
||||||
echo
|
echo
|
||||||
|
|
||||||
|
# REPTEST ASSEMBLY
|
||||||
|
ASM_BUILD_DIR=reptest_build
|
||||||
|
ASM_SRC="./src/repetition_testing/reptest_functions.asm"
|
||||||
|
ASM_OBJ="./$ASM_BUILD_DIR/funcs.o"
|
||||||
|
ASM_LIB="./$ASM_BUILD_DIR/libfuncs.a"
|
||||||
|
|
||||||
|
mkdir $ASM_BUILD_DIR
|
||||||
|
|
||||||
|
(set -x ; $ASM $ASM_FLAGS $ASM_SRC -o $ASM_OBJ)
|
||||||
|
(set -x ; $AR $AR_FLAGS $ASM_LIB $ASM_OBJ)
|
||||||
|
echo
|
||||||
|
|
||||||
if [[ $BASIC_PROFILING == true ]] || [[ $FULL_PROFILING == true ]]; then
|
if [[ $BASIC_PROFILING == true ]] || [[ $FULL_PROFILING == true ]]; then
|
||||||
if [[ $FULL_PROFILING == true ]]; then
|
if [[ $FULL_PROFILING == true ]]; then
|
||||||
JSONFLAGS+="-DFULL_PROFILING"
|
JSONFLAGS+="-DFULL_PROFILING"
|
||||||
@@ -95,7 +113,7 @@ if [[ $BASIC_PROFILING == true ]] || [[ $FULL_PROFILING == true ]]; then
|
|||||||
cd ../
|
cd ../
|
||||||
|
|
||||||
# REPETITION TESTING
|
# REPETITION TESTING
|
||||||
REPTESTSRC="./src/repetition_testing/*.cpp ./$PROF_BUILD_DIR/*.o"
|
REPTESTSRC="./src/repetition_testing/*.cc ./$PROF_BUILD_DIR/*.o $ASM_LIB"
|
||||||
REPTESTOUT=reptest
|
REPTESTOUT=reptest
|
||||||
|
|
||||||
(set -x ; $CXX $CFLAGS $REPTESTFLAGS $REPTESTSRC -o $REPTESTOUT)
|
(set -x ; $CXX $CFLAGS $REPTESTFLAGS $REPTESTSRC -o $REPTESTOUT)
|
||||||
@@ -114,4 +132,4 @@ cd ../
|
|||||||
echo
|
echo
|
||||||
|
|
||||||
# CLEAR BUILD FILES
|
# CLEAR BUILD FILES
|
||||||
rm -rvf $JSON_BUILD_DIR $PROF_BUILD_DIR
|
rm -rvf $JSON_BUILD_DIR $PROF_BUILD_DIR $ASM_BUILD_DIR
|
||||||
|
|||||||
1756
haversine_02/src/repetition_testing/main.cc
Normal file
1756
haversine_02/src/repetition_testing/main.cc
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,197 +0,0 @@
|
|||||||
#include "aliases.h"
|
|
||||||
#include "profiler/timer.h"
|
|
||||||
#include "repetition_testing/reptester.h"
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#define ARR_LEN(ARR) sizeof(ARR) / sizeof(*ARR)
|
|
||||||
|
|
||||||
void test_fread(reptester *tester, alloc_type type);
|
|
||||||
void test_read(reptester *tester, alloc_type type);
|
|
||||||
void test_write(reptester *tester, alloc_type type);
|
|
||||||
u64 get_file_length(FILE *fp);
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
const char *filename = NULL;
|
|
||||||
u64 waves = 1;
|
|
||||||
|
|
||||||
switch (argc) {
|
|
||||||
case 3:
|
|
||||||
waves = atol(argv[2]);
|
|
||||||
// break left out intentionally
|
|
||||||
case 2:
|
|
||||||
filename = argv[1];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
printf("Usage: reptest FILENAME [WAVE_COUNT]\n");
|
|
||||||
return -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// clang-format off
|
|
||||||
reptester tester = {
|
|
||||||
{filename, NULL, 0, 0}, // params
|
|
||||||
get_cpu_freq(500), // cpu_freq
|
|
||||||
|
|
||||||
10.0, // wait_time_secs
|
|
||||||
0.0, // test_time_secs
|
|
||||||
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
|
|
||||||
};
|
|
||||||
// clang-format on
|
|
||||||
|
|
||||||
FILE *fp = fopen(tester.params.filename, "rb");
|
|
||||||
if (!fp) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
func_data funcs[] = {
|
|
||||||
{{"WRITE", "WRITE WITH MALLOC"}, test_write},
|
|
||||||
{{"READ", "READ WITH MALLOC"}, test_read},
|
|
||||||
{{"FREAD", "FREAD WITH MALLOC"}, test_fread},
|
|
||||||
};
|
|
||||||
|
|
||||||
tester.params.read_size = get_file_length(fp);
|
|
||||||
tester.params.read_count = 1;
|
|
||||||
tester.params.buffer = (char *)malloc(tester.params.read_size + 1);
|
|
||||||
memset(tester.params.buffer, 0, tester.params.read_size + 1);
|
|
||||||
|
|
||||||
for (u64 i = 0; i < waves; ++i) {
|
|
||||||
for (u64 j = 0; j < ARR_LEN(funcs); ++j) {
|
|
||||||
for (u64 k = 0; k < COUNT_ALLOC_TYPE; ++k) {
|
|
||||||
run_func_test(&tester, funcs[j].func, funcs[j].names[k], (alloc_type)k);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
|
|
||||||
free(tester.params.buffer);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_fread(reptester *tester, alloc_type type) {
|
|
||||||
FILE *fp = fopen(tester->params.filename, "rb");
|
|
||||||
if (!fp) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 start = read_cpu_timer();
|
|
||||||
u64 fault_count_start = page_fault_count();
|
|
||||||
|
|
||||||
handle_alloc(tester, type);
|
|
||||||
|
|
||||||
u64 obj_count = fread(tester->params.buffer, tester->params.read_size,
|
|
||||||
tester->params.read_count, fp);
|
|
||||||
|
|
||||||
u64 fault_count_end = page_fault_count();
|
|
||||||
u64 end = read_cpu_timer();
|
|
||||||
|
|
||||||
u64 bytes_read = obj_count * tester->params.read_size;
|
|
||||||
|
|
||||||
u64 read_time = end - start;
|
|
||||||
u64 page_faults = fault_count_end - fault_count_start;
|
|
||||||
|
|
||||||
tester->results = {
|
|
||||||
bytes_read,
|
|
||||||
read_time,
|
|
||||||
page_faults,
|
|
||||||
};
|
|
||||||
|
|
||||||
handle_free(tester, type);
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_read(reptester *tester, alloc_type type) {
|
|
||||||
FILE *fp = fopen(tester->params.filename, "rb");
|
|
||||||
if (!fp) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
u64 start = read_cpu_timer();
|
|
||||||
u64 fault_count_start = page_fault_count();
|
|
||||||
|
|
||||||
handle_alloc(tester, type);
|
|
||||||
|
|
||||||
i32 fd = fileno(fp);
|
|
||||||
|
|
||||||
u64 bytes_read = read(fd, tester->params.buffer,
|
|
||||||
tester->params.read_size * tester->params.read_count);
|
|
||||||
|
|
||||||
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 = {
|
|
||||||
bytes_read,
|
|
||||||
read_time,
|
|
||||||
page_faults,
|
|
||||||
};
|
|
||||||
|
|
||||||
handle_free(tester, type);
|
|
||||||
|
|
||||||
fclose(fp);
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_write(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;
|
|
||||||
|
|
||||||
for (u64 i = 0; i < total_size; ++i) {
|
|
||||||
tester->params.buffer[i] = '0';
|
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
fseek(fp, 0, SEEK_END);
|
|
||||||
|
|
||||||
u64 length = ftell(fp);
|
|
||||||
|
|
||||||
fseek(fp, 0, SEEK_SET);
|
|
||||||
|
|
||||||
return length;
|
|
||||||
}
|
|
||||||
529
haversine_02/src/repetition_testing/reptest_functions.asm
Normal file
529
haversine_02/src/repetition_testing/reptest_functions.asm
Normal file
@@ -0,0 +1,529 @@
|
|||||||
|
global mov_all_bytes_asm
|
||||||
|
global nop_all_bytes_asm
|
||||||
|
global nop_1x3_all_bytes_asm
|
||||||
|
global nop_1x9_all_bytes_asm
|
||||||
|
global inc_all_bytes_asm
|
||||||
|
global dec_all_bytes_asm
|
||||||
|
global align64_loop
|
||||||
|
global align1_loop
|
||||||
|
global align15_loop
|
||||||
|
global align31_loop
|
||||||
|
global align63_loop
|
||||||
|
global align75_loop
|
||||||
|
global align90_loop
|
||||||
|
global align112_loop
|
||||||
|
global rat_add
|
||||||
|
global rat_mov_add
|
||||||
|
global read_1
|
||||||
|
global read_2
|
||||||
|
global read_3
|
||||||
|
global read_4
|
||||||
|
global read_8
|
||||||
|
global write_1
|
||||||
|
global write_2
|
||||||
|
global write_3
|
||||||
|
global write_4
|
||||||
|
global write_8
|
||||||
|
global read_1x2_low
|
||||||
|
global read_1x2_high
|
||||||
|
global read_2x2
|
||||||
|
global read_4x2
|
||||||
|
global read_8x2
|
||||||
|
global read_4x2_simd
|
||||||
|
global read_8x2_simd
|
||||||
|
global read_16x2_simd
|
||||||
|
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
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
mov BYTE [rdi + rax * 1], al
|
||||||
|
inc rax
|
||||||
|
cmp rsi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
nop_all_bytes_asm:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
db 0x0f, 0x1f, 0x00
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
nop_1x3_all_bytes_asm:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
nop_1x9_all_bytes_asm:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
nop
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
inc_all_bytes_asm:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
dec_all_bytes_asm:
|
||||||
|
.loop:
|
||||||
|
dec rdi
|
||||||
|
jnz .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align64_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align1_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
nop
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align15_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 15
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align31_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 31
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align63_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 63
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align75_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 75
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align90_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 90
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
align112_loop:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
%rep 112
|
||||||
|
nop
|
||||||
|
%endrep
|
||||||
|
.loop:
|
||||||
|
inc rax
|
||||||
|
cmp rdi, rax
|
||||||
|
jne .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
rat_add:
|
||||||
|
mov rax, rdi
|
||||||
|
|
||||||
|
.loop:
|
||||||
|
add rcx, 1
|
||||||
|
add rcx, 1
|
||||||
|
dec rax
|
||||||
|
jnz .loop
|
||||||
|
ret
|
||||||
|
|
||||||
|
rat_mov_add:
|
||||||
|
mov rax, rdi
|
||||||
|
|
||||||
|
.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
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_2:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 2
|
||||||
|
mov rax, [rdi]
|
||||||
|
%endrep
|
||||||
|
sub rsi, 2
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_3:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 3
|
||||||
|
mov rax, [rdi]
|
||||||
|
%endrep
|
||||||
|
sub rsi, 3
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_4:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 4
|
||||||
|
mov rax, [rdi]
|
||||||
|
%endrep
|
||||||
|
sub rsi, 4
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_8:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 8
|
||||||
|
mov rax, [rdi]
|
||||||
|
%endrep
|
||||||
|
sub rsi, 8
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
write_1:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
mov QWORD [rdi], 0
|
||||||
|
sub rsi, 1
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
write_2:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 2
|
||||||
|
mov QWORD [rdi], 0
|
||||||
|
%endrep
|
||||||
|
sub rsi, 2
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
write_3:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 3
|
||||||
|
mov QWORD [rdi], 0
|
||||||
|
%endrep
|
||||||
|
sub rsi, 3
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
write_4:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 4
|
||||||
|
mov QWORD [rdi], 0
|
||||||
|
%endrep
|
||||||
|
sub rsi, 4
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
write_8:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 8
|
||||||
|
mov QWORD [rdi], 0
|
||||||
|
%endrep
|
||||||
|
sub rsi, 8
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_1x2_low:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 2
|
||||||
|
mov al, [rdi]
|
||||||
|
%endrep
|
||||||
|
sub rsi, 2
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_1x2_high:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 2
|
||||||
|
mov ah, [rdi]
|
||||||
|
%endrep
|
||||||
|
sub rsi, 2
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_2x2:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 2
|
||||||
|
mov ax, [rdi]
|
||||||
|
%endrep
|
||||||
|
sub rsi, 2
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_4x2:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 2
|
||||||
|
mov eax, [rdi]
|
||||||
|
%endrep
|
||||||
|
sub rsi, 2
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_8x2:
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 2
|
||||||
|
mov rax, [rdi]
|
||||||
|
%endrep
|
||||||
|
sub rsi, 2
|
||||||
|
jnle .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_4x2_simd:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
mov r8d, [rdi]
|
||||||
|
mov r8d, [rdi + 4]
|
||||||
|
add rax, 8
|
||||||
|
cmp rax, rsi
|
||||||
|
jb .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_8x2_simd:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
mov r8, [rdi]
|
||||||
|
mov r8, [rdi + 8]
|
||||||
|
add rax, 16
|
||||||
|
cmp rax, rsi
|
||||||
|
jb .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_16x2_simd:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
vmovdqu xmm0, [rdi]
|
||||||
|
vmovdqu xmm0, [rdi + 16]
|
||||||
|
add rax, 32
|
||||||
|
cmp rax, rsi
|
||||||
|
jb .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_32x2_simd_offset:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
vmovdqu ymm0, [rdi]
|
||||||
|
vmovdqu ymm0, [rdi + 32]
|
||||||
|
add rax, 64
|
||||||
|
cmp rax, rsi
|
||||||
|
jb .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_32x2_simd_no_offset:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
vmovdqu ymm0, [rdi]
|
||||||
|
vmovdqu ymm0, [rdi]
|
||||||
|
add rax, 64
|
||||||
|
cmp rax, rsi
|
||||||
|
jb .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_16x4_simd:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 2
|
||||||
|
vmovdqu xmm0, [rdi]
|
||||||
|
vmovdqu xmm0, [rdi + 16]
|
||||||
|
%endrep
|
||||||
|
add rax, 64
|
||||||
|
cmp rax, rsi
|
||||||
|
jb .loop
|
||||||
|
|
||||||
|
ret
|
||||||
|
|
||||||
|
read_32x4_simd:
|
||||||
|
xor rax, rax
|
||||||
|
|
||||||
|
align 64
|
||||||
|
.loop:
|
||||||
|
%rep 2
|
||||||
|
vmovdqu ymm0, [rdi]
|
||||||
|
vmovdqu ymm0, [rdi]
|
||||||
|
%endrep
|
||||||
|
add rax, 128
|
||||||
|
cmp rax, rsi
|
||||||
|
jb .loop
|
||||||
|
|
||||||
|
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 <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
@@ -10,7 +11,9 @@ void handle_alloc(reptester *tester, alloc_type type) {
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case ALLOC_TYPE_WITH_MALLOC:
|
case ALLOC_TYPE_WITH_MALLOC:
|
||||||
if (!(tester->params.buffer)) {
|
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);
|
memset(tester->params.buffer, 0, tester->params.read_size + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -24,7 +27,7 @@ void handle_free(reptester *tester, alloc_type type) {
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case ALLOC_TYPE_WITH_MALLOC:
|
case ALLOC_TYPE_WITH_MALLOC:
|
||||||
if (tester->params.buffer) {
|
if (tester->params.buffer) {
|
||||||
free(tester->params.buffer);
|
munmap(tester->params.buffer, tester->params.read_size + 1);
|
||||||
tester->params.buffer = NULL;
|
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) {
|
if (type == ALLOC_TYPE_WITH_MALLOC) {
|
||||||
buffer = tester->params.buffer;
|
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);
|
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) {
|
if (type == ALLOC_TYPE_WITH_MALLOC) {
|
||||||
free(tester->params.buffer);
|
munmap(tester->params.buffer, tester->params.read_size + 1);
|
||||||
tester->params.buffer = buffer;
|
tester->params.buffer = buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user