This commit is contained in:
quackerd 2023-05-01 21:18:34 +02:00
parent 1a90104d53
commit aba80e8869
2 changed files with 147 additions and 1 deletions

View File

@ -21,7 +21,7 @@ set(CC_FLAGS -O2 -g -Wall -Wextra -Werror -std=c++11
-Wno-gnu-zero-variadic-macro-arguments -Wno-gnu-zero-variadic-macro-arguments
-march=native) -march=native)
set(C_FLAGS -O2 -g -Wall -Wextra -Werror -std=c17 set(C_FLAGS -O2 -g -Wall -Wextra -Werror -std=c2x
-Wno-deprecated-declarations -Wno-deprecated-declarations
-Wno-address-of-packed-member -Wno-address-of-packed-member
-Wno-zero-length-array -Wno-zero-length-array
@ -76,6 +76,10 @@ add_executable(memloadgen util/memloadgen.cc)
target_link_libraries(memloadgen PRIVATE pthread gen ntr nms ${TOPO_LINK_LIBRARIES}) target_link_libraries(memloadgen PRIVATE pthread gen ntr nms ${TOPO_LINK_LIBRARIES})
target_compile_options(memloadgen PRIVATE ${CC_FLAGS} ${TOPO_CFLAGS}) target_compile_options(memloadgen PRIVATE ${CC_FLAGS} ${TOPO_CFLAGS})
add_executable(mornafah util/mornafah.c)
target_link_libraries(mornafah PRIVATE pthread gen ntr nms ${TOPO_LINK_LIBRARIES})
target_compile_options(mornafah PRIVATE ${C_FLAGS} ${TOPO_CFLAGS})
add_executable(nms_test tests/nms_test.c) add_executable(nms_test tests/nms_test.c)
set_target_properties(nms_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/tests) set_target_properties(nms_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/tests)
target_link_libraries(nms_test PRIVATE nms) target_link_libraries(nms_test PRIVATE nms)

142
util/mornafah.c Normal file
View File

@ -0,0 +1,142 @@
#include <stdio.h>
#include <stdlib.h>
#include "nms.h"
#include <getopt.h>
#include <unistd.h>
#include <topo.h>
#include <immintrin.h>
#include <x86intrin.h>
#include <sys/cpuset.h>
#include <pthread.h>
#include <pthread_np.h>
#define BUFFER_SIZE (1 * 1024 * 1024)
static _Atomic int flush = 0;
static int * remote_buffer = NULL;
static uint64_t latencies[65536] = {0};
static int times = 10;
static int local_core = 0;
static int remote_core = 1;
static int cache_mode = 0;
static void * local_thread(void *)
{
int temp;
unsigned int dummy;
uint64_t start, end, base;
printf("Local thread running...\n");
while(times > 0) {
flush = 1;
while(flush != 0) {
}
_mm_clflush(remote_buffer);
start = __rdtscp(&dummy);
end = __rdtscp(&dummy);
base = end - start;
start = __rdtscp(&dummy);
temp = *remote_buffer;
end = __rdtscp(&dummy);
latencies[times - 1] = end - start - base;
times--;
}
return (void *)(uintptr_t)temp;
}
static void * remote_thread(void *)
{
int temp;
printf("Remote thread running...\n");
while(1) {
while(flush == 0) {
}
if(cache_mode) {
temp = *remote_buffer;
} else {
_mm_clflush(remote_buffer);
}
flush = 0;
}
return (void *)(uintptr_t)temp;
}
int main(int argc, char * argv[])
{
{
int c;
// parse arguments
while ((c = getopt(argc, argv, "l:r:t:m:")) != -1) {
switch (c) {
case 'l':
local_core = atoi(optarg);
break;
case 'r':
remote_core = atoi(optarg);
break;
case 't':
times = atoi(optarg);
break;
case 'm':
cache_mode = atoi(optarg);
break;
default:
exit(1);
}
}
}
// init topo
if (topo_init(1)) {
fprintf(stderr, "libtopo init failed!\n");
exit(1);
}
// init
if (nms_init(1)) {
fprintf(stderr, "libnms init failed!\n");
exit(1);
}
int remote_numa = topo_core_to_numa(remote_core);
int local_numa = topo_core_to_numa(local_core);
int total = times;
remote_buffer = nms_alloc_static(remote_numa, BUFFER_SIZE);
*remote_buffer = 0xffa5be6c;
pthread_attr_t lattr, rattr;
pthread_t lthread, rthread;
cpuset_t lcpuset, rcpuset;
CPU_ZERO(&lcpuset);
CPU_ZERO(&rcpuset);
CPU_SET(local_core, &lcpuset);
CPU_SET(remote_core, &rcpuset);
pthread_attr_init(&rattr);
pthread_attr_setaffinity_np(&rattr, sizeof(cpuset_t), &rcpuset);
pthread_attr_init(&lattr);
pthread_attr_setaffinity_np(&lattr, sizeof(cpuset_t), &lcpuset);
printf("local thread: %d numa: %d, remote: %d numa: %d\n", local_core, local_numa, remote_core, remote_numa);
pthread_create(&lthread, &lattr, local_thread, NULL);
pthread_create(&rthread, &rattr, remote_thread, NULL);
pthread_join(lthread, NULL);
uint64_t sum = 0;
for (int i = total - 1; i >= 0; i--) {
printf("%lu\n", latencies[i]);
sum += latencies[i];
}
printf("Avg: %lu\n", sum / total);
return 0;
}