From 13770e0f40a46e27e967bcbf9def3203bb56c02b Mon Sep 17 00:00:00 2001 From: solsta <segorov555@gmail.com> Date: Tue, 26 Apr 2022 17:26:20 +0000 Subject: [PATCH] Pmem support for norec --- backends/norec/Defines.common.mk | 2 +- backends/norec/Makefile | 2 +- backends/norec/thread.c | 6 +- build.sh | 4 +- manual_example/Defines.common.mk | 17 ++++ manual_example/Makefile | 4 + manual_example/shared_memory_example | Bin 0 -> 167952 bytes manual_example/shared_memory_example.c | 133 +++++++++++++++++++++++++ norec/Makefile | 1 + norec/norec.c | 52 ++++++++-- norec/norec.h | 8 +- 11 files changed, 209 insertions(+), 20 deletions(-) create mode 100644 manual_example/Defines.common.mk create mode 100644 manual_example/Makefile create mode 100755 manual_example/shared_memory_example create mode 100644 manual_example/shared_memory_example.c diff --git a/backends/norec/Defines.common.mk b/backends/norec/Defines.common.mk index 193874c..6e54f22 100644 --- a/backends/norec/Defines.common.mk +++ b/backends/norec/Defines.common.mk @@ -1,7 +1,7 @@ CC := gcc CFLAGS += -g -Wall -pthread CFLAGS += -O3 -CFLAGS += -I$(LIB) -I../rapl-power/ +CFLAGS += -I$(LIB) CPP := g++ CPPFLAGS += $(CFLAGS) LD := g++ diff --git a/backends/norec/Makefile b/backends/norec/Makefile index 4e52694..e0cbc1a 100644 --- a/backends/norec/Makefile +++ b/backends/norec/Makefile @@ -1,7 +1,7 @@ CFLAGS += -w -DSTM -I$(STM) CPPFLAGS := $(CFLAGS) LDFLAGS += -L$(STM) -LIBS += -lnorec -L../rapl-power -lrapl +LIBS += -lnorec .PHONY: default default: $(PROG) diff --git a/backends/norec/thread.c b/backends/norec/thread.c index 383169f..453352d 100644 --- a/backends/norec/thread.c +++ b/backends/norec/thread.c @@ -7,7 +7,7 @@ #include <sched.h> #include "thread.h" #include "types.h" -#include "rapl.h" +//#include "rapl.h" static THREAD_LOCAL_T global_threadId; static long global_numThread = 1; @@ -38,7 +38,7 @@ static void threadWait (void* argPtr) global_funcPtr(global_argPtr); THREAD_BARRIER(global_barrierPtr, threadId); /* wait for end parallel */ if (threadId == 0) { - endEnergy(); + //endEnergy(); break; } } @@ -71,7 +71,7 @@ void thread_startup (long numThread) global_threads = (THREAD_T*)malloc(numThread * sizeof(THREAD_T)); assert(global_threads); - startEnergy(); + //startEnergy(); /* Set up pool */ THREAD_ATTR_INIT(global_threadAttr); diff --git a/build.sh b/build.sh index 67dc7f6..2b43f71 100644 --- a/build.sh +++ b/build.sh @@ -1,7 +1,7 @@ #!/bin/sh -FOLDERS="genome intruder kmeans labyrinth ssca2 vacation yada redblacktree hashmap" - +FOLDERS="manual_example" +#genome intruder kmeans labyrinth ssca2 vacation yada redblacktree hashmap bash clean.sh echo "Configuring $1" diff --git a/manual_example/Defines.common.mk b/manual_example/Defines.common.mk new file mode 100644 index 0000000..4b790c8 --- /dev/null +++ b/manual_example/Defines.common.mk @@ -0,0 +1,17 @@ +LIBS += -lm + +PROG := shared_memory_example + +SRCS += \ + shared_memory_example.c \ + $(LIB)/list.c \ + $(LIB)/mt19937ar.c \ + $(LIB)/pair.c \ + $(LIB)/queue.c \ + $(LIB)/random.c \ + $(LIB)/thread.c \ + $(LIB)/vector.c \ +# +OBJS := ${SRCS:.c=.o} + +CFLAGS += -DUSE_EARLY_RELEASE diff --git a/manual_example/Makefile b/manual_example/Makefile new file mode 100644 index 0000000..3b67385 --- /dev/null +++ b/manual_example/Makefile @@ -0,0 +1,4 @@ +LIBS = -lpmemobj +include ../common/Defines.common.mk +include ./Defines.common.mk +include ../common/Makefile diff --git a/manual_example/shared_memory_example b/manual_example/shared_memory_example new file mode 100755 index 0000000000000000000000000000000000000000..25d85b9dbb0f52e0a08b34970c54922db275e7cd GIT binary patch literal 167952 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⪚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%0AXQGzeeZ*(C1736;l==1yE;z0e( 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 Y{P|u1^X=>M5R#wwE+b#{1iYsDzfO6mt^fc4 literal 0 HcmV?d00001 diff --git a/manual_example/shared_memory_example.c b/manual_example/shared_memory_example.c new file mode 100644 index 0000000..10f2df2 --- /dev/null +++ b/manual_example/shared_memory_example.c @@ -0,0 +1,133 @@ +#include <stdio.h> +#include <stdlib.h> +#include <libpmemobj/base.h> +#include <unistd.h> +#include <stdbool.h> +#include <libpmemobj/pool_base.h> +#include <libpmemobj/types.h> +#include "list.h" +#include "thread.h" +#include <libpmemobj/tx_base.h> + +#define shared_memory_size 10000 + +struct thread_context{ + char buff[shared_memory_size]; +}; + +struct dram_thread_context{ + PMEMobjpool *pop; + struct thread_context *th; +}; + +struct pmem_obj_root{ + struct thread_context th; +}; + +static void +log_stages(PMEMobjpool *pop_local, enum pobj_tx_stage stage, void *arg) +{ + /* Commenting this out because this is not required during normal execution. */ + /* dr_fprintf(STDERR, "cb stage: ", desc[stage], " "); */ +} + +bool file_exists(const char *path){ + return access(path, F_OK) != 0; +} + +void *p_region(void *context){ + struct dram_thread_context *dramThreadContext = context; + struct thread_context *th = dramThreadContext->th; + + int *attempt = malloc(sizeof(int)); + *attempt = 0; + + /* --------------------------- */ + //TM_THREAD_ENTER(); + Thread *Self = TxNewThread(); + TxInitThread(Self, thread_getId()); + /* --------------------------- */ + + /* -------- */ + //TM_BEGIN(); + + do { \ + STM_JMPBUF_T STM_JMPBUF; \ + sigsetjmp(STM_JMPBUF, 1); \ + TxStart(STM_SELF, &STM_JMPBUF); \ + } while (0); + /* -----------*/ + + //ABORTED TRANSACTION JUMPS TO THIS POINT + + char randomletter = 'A' + (random() % 26); + for (int i = 0; i < shared_memory_size; i++) { + TM_SHARED_WRITE(th->buff[i], randomletter); + } + + /* --------------------------- */ + //TM_END(); + TxCommit(Self, dramThreadContext->pop); + /* --------------------------- */ + //Changes are visible here + printf("Post TM_END written to shared_write: %c Current local value: %c\n", randomletter, th->buff[0]); + TM_THREAD_EXIT(); + return 0; +} + + +PMEMobjpool *mmap_pmem_object_pool(PMEMobjpool *pop){ + char *path_to_pmem = "/mnt/dax/test_outputs/norec_with_pmem"; + if (file_exists((path_to_pmem)) != 0) { + if ((pop = pmemobj_create(path_to_pmem, POBJ_LAYOUT_NAME(list),10000000, 0666)) == NULL) + perror("failed to create pool\n"); + } else { + if ((pop = pmemobj_open(path_to_pmem, POBJ_LAYOUT_NAME(list))) == NULL) { + perror("failed to open pool\n"); + } + } + return pop; +} + +struct thread_context* initialise_thread_context_on_persistent_memory(PMEMobjpool *pop){ + PMEMoid pool_root = pmemobj_root(pop, sizeof(struct pmem_obj_root)); + struct pmem_obj_root *rootp = pmemobj_direct(pool_root); + return &rootp->th; +} + +MAIN(argc, argv) +{ + PMEMobjpool *pop = NULL; + pop = mmap_pmem_object_pool(pop); + struct thread_context *th = initialise_thread_context_on_persistent_memory(pop); + struct dram_thread_context *dramThreadContext = malloc(sizeof (struct dram_thread_context)); + dramThreadContext->pop = pop; + dramThreadContext->th = th; + + printf("Initial content:\n"); + for(int i=0; i< shared_memory_size; i++ ){ + printf("%c", th->buff[i]); + } + puts("\n"); + + GOTO_REAL(); + int arr_len = 30; + TM_STARTUP(arr_len); + pthread_t thread_array[arr_len]; + + for (int i = 0; i < arr_len; i++) { + pthread_create(&thread_array[i], NULL, p_region, dramThreadContext); + } + + for (int i = 0; i < arr_len; i++) { + pthread_join(thread_array[i], NULL); + } + + printf("Result:\n"); + for(int i=0; i< shared_memory_size; i++ ){ + printf("%c", th->buff[i]); + } + printf("\n"); + TM_SHUTDOWN(); + MAIN_RETURN(0); +} \ No newline at end of file diff --git a/norec/Makefile b/norec/Makefile index 8c0a1e2..78ed996 100644 --- a/norec/Makefile +++ b/norec/Makefile @@ -15,6 +15,7 @@ CFLAGS := -g -w -O3 LD := gcc LIBNOREC := libnorec.a +LIBS = -lpmemobj SRCS := \ norec.c \ diff --git a/norec/norec.c b/norec/norec.c index b479704..ca13de0 100644 --- a/norec/norec.c +++ b/norec/norec.c @@ -5,6 +5,8 @@ #include <assert.h> #include <pthread.h> #include <signal.h> +#include <libpmemobj/base.h> +#include <libpmemobj/tx_base.h> #include "platform.h" #include "norec.h" #include "util.h" @@ -174,14 +176,41 @@ ExtendList (AVPair* tail) return e; } +static void +log_stages(PMEMobjpool *pop_local, enum pobj_tx_stage stage, void *arg) +{ + /* Commenting this out because this is not required during normal execution. */ + /* dr_fprintf(STDERR, "cb stage: ", desc[stage], " "); */ +} + + __INLINE__ void -WriteBackForward (Log* k) +WriteBackForward (Log* k, PMEMobjpool *pop) { + //printf("writeback point\n"); AVPair* e; AVPair* End = k->put; + + //Add to the undo log + printf("Starting a transaction\n"); + /* Sometimes breaks here */ + pmemobj_tx_begin(pop, NULL, TX_PARAM_CB, log_stages, NULL, + TX_PARAM_NONE); + printf("transaction started\n"); + //Write + printf("Starting a write\n"); for (e = k->List; e != End; e = e->Next) { + //printf("adding %p to tx\n", e->Addr); + pmemobj_tx_add_range_direct(e->Addr, 1); *(e->Addr) = e->Valu; } + printf("Written to pmem\n"); + //Commit + pmemobj_tx_commit(); + printf("Commited\n"); + pmemobj_tx_end(); + printf("Ended\n"); + } void @@ -277,6 +306,7 @@ txReset (Thread* Self) __INLINE__ void txCommitReset (Thread* Self) { + printf("Attempt to reset\n"); txReset(Self); Self->Retries = 0; } @@ -325,7 +355,7 @@ backoff (Thread* Self, long attempt) __INLINE__ long -TryFastUpdate (Thread* Self) +TryFastUpdate (Thread* Self, PMEMobjpool *pop) { Log* const wr = &Self->wrSet; long ctr; @@ -339,7 +369,7 @@ TryFastUpdate (Thread* Self) } { - WriteBackForward(wr); /* write-back the deferred stores */ + WriteBackForward(wr, pop); /* write-back the deferred stores */ } MEMBARSTST(); /* Ensure the above stores are visible */ LOCK->value = Self->snapshot + 2; @@ -351,6 +381,7 @@ TryFastUpdate (Thread* Self) void TxAbort (Thread* Self) { + printf("TX aborted\n"); Self->Retries++; Self->Aborts++; @@ -445,7 +476,7 @@ TxStart (Thread* Self, sigjmp_buf* envPtr) } int -TxCommit (Thread* Self) +TxCommit (Thread* Self, PMEMobjpool *pop) { /* Fast-path: Optional optimization for pure-readers */ if (Self->wrSet.put == Self->wrSet.List) @@ -454,7 +485,8 @@ TxCommit (Thread* Self) return 1; } - if (TryFastUpdate(Self)) { + if (TryFastUpdate(Self, pop)) { + printf("Calling reset after tryFastUpdate\n"); txCommitReset(Self); return 1; } @@ -464,7 +496,7 @@ TxCommit (Thread* Self) } int -TxCommitSTM (Thread* Self) +TxCommitSTM (Thread* Self, PMEMobjpool *pop) { /* Fast-path: Optional optimization for pure-readers */ if (Self->wrSet.put == Self->wrSet.List) @@ -473,7 +505,7 @@ TxCommitSTM (Thread* Self) return 1; } - if (TryFastUpdate(Self)) { + if (TryFastUpdate(Self, pop)) { txCommitReset(Self); return 1; } @@ -510,8 +542,9 @@ long TxValidate (Thread* Self) { } -long TxFinalize (Thread* Self, long clock) { +long TxFinalize (Thread* Self, long clock, PMEMobjpool *pop) { if (Self->wrSet.put == Self->wrSet.List) { + printf("Calling commit reset in TXFinalize\n"); txCommitReset(Self); return 0; } @@ -521,12 +554,13 @@ long TxFinalize (Thread* Self, long clock) { } Log* const wr = &Self->wrSet; - WriteBackForward(wr); /* write-back the deferred stores */ + WriteBackForward(wr, pop); /* write-back the deferred stores */ LOCK->value += LOCK->value + 2; return 0; } void TxResetAfterFinalize (Thread* Self) { + printf("Calling commit reset after TXFinalize\n"); txCommitReset(Self); } diff --git a/norec/norec.h b/norec/norec.h index b85d7a7..38c1820 100644 --- a/norec/norec.h +++ b/norec/norec.h @@ -59,7 +59,7 @@ extern "C" { - +#include <libpmemobj/base.h> # include <setjmp.h> # define SIGSETJMP(env, savesigs) sigsetjmp(env, savesigs) # define SIGLONGJMP(env, val) siglongjmp(env, val); assert(0) @@ -83,8 +83,8 @@ Thread* TxNewThread (); void TxFreeThread (Thread*); void TxInitThread (Thread*, long id); -int TxCommit (Thread*); -int TxCommitSTM (Thread*); +int TxCommit (Thread*, PMEMobjpool *pop); +int TxCommitSTM (Thread*, PMEMobjpool *pop); void TxAbort (Thread*); intptr_t TxLoad (Thread*, volatile intptr_t*); void TxStore (Thread*, volatile intptr_t*, intptr_t); @@ -98,7 +98,7 @@ void TxFree (Thread*, void*); void TxIncClock (); long TxValidate (Thread*); -long TxFinalize (Thread*, long); +long TxFinalize (Thread*, long, PMEMobjpool *pop); void TxResetAfterFinalize (Thread*); -- GitLab