From 2dc54a81869d487490b72bf1e5789ee1e4485336 Mon Sep 17 00:00:00 2001 From: unknown <> Date: Thu, 29 Feb 2024 22:22:50 -0500 Subject: [PATCH] Create threadpool in c land --- src/main/c/compile.sh | 7 ++- src/main/c/includes/electrosphere_FluidSim.h | 8 ++++ src/main/c/includes/threadpool.h | 11 +++++ src/main/c/src/densitystep.c | 1 - src/main/c/src/threadpool.c | 45 ++++++++++++++++++++ src/main/java/electrosphere/FluidSim.java | 8 ++++ src/main/java/electrosphere/Main.java | 2 + 7 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 src/main/c/includes/threadpool.h create mode 100644 src/main/c/src/threadpool.c diff --git a/src/main/c/compile.sh b/src/main/c/compile.sh index f210ea5..12cc9cf 100644 --- a/src/main/c/compile.sh +++ b/src/main/c/compile.sh @@ -56,12 +56,17 @@ INPUT_FILES="./src/chunkmask.c" OUTPUT_FILE="./chunkmask.o" gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE +COMPILE_FLAGS="-c -fPIC -m64 -mavx -mavx2 -O1" +INPUT_FILES="./src/threadpool.c" +OUTPUT_FILE="./threadpool.o" +gcc $COMPILE_FLAGS -I"$BASE_INCLUDE_DIR" -I"$OS_INCLUDE_DIR" $INPUT_FILES -o $OUTPUT_FILE + #compile shared object file OUTPUT_FILE="libfluidsim$LIB_ENDING" COMPILE_FLAGS="-shared" -INPUT_FILES="densitystep.o velocitystep.o chunkmask.o" +INPUT_FILES="densitystep.o velocitystep.o chunkmask.o threadpool.o" gcc $COMPILE_FLAGS $INPUT_FILES -o $OUTPUT_FILE #move to resources diff --git a/src/main/c/includes/electrosphere_FluidSim.h b/src/main/c/includes/electrosphere_FluidSim.h index 4d2531b..c9fdbfa 100644 --- a/src/main/c/includes/electrosphere_FluidSim.h +++ b/src/main/c/includes/electrosphere_FluidSim.h @@ -121,6 +121,14 @@ JNIEXPORT void JNICALL Java_electrosphere_FluidSim_setBoundsToNeighbors JNIEXPORT void JNICALL Java_electrosphere_FluidSim_copyNeighbors (JNIEnv *, jobject, jint, jint, jint, jint, jobjectArray); +/* + * Class: electrosphere_FluidSim + * Method: createThreadpool + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_electrosphere_FluidSim_createThreadpool + (JNIEnv *, jclass, jint); + #ifdef __cplusplus } #endif diff --git a/src/main/c/includes/threadpool.h b/src/main/c/includes/threadpool.h new file mode 100644 index 0000000..6698e65 --- /dev/null +++ b/src/main/c/includes/threadpool.h @@ -0,0 +1,11 @@ +#ifndef THREADPOOL +#define THREADPOOL + + +typedef struct { + int numThreads; + pthread_t * threads; +} ThreadPool; + + +#endif \ No newline at end of file diff --git a/src/main/c/src/densitystep.c b/src/main/c/src/densitystep.c index b83af0d..c318aa5 100644 --- a/src/main/c/src/densitystep.c +++ b/src/main/c/src/densitystep.c @@ -2,7 +2,6 @@ #include #include #include -#include #include "../includes/libfluidsim.h" #include "../includes/utilities.h" diff --git a/src/main/c/src/threadpool.c b/src/main/c/src/threadpool.c new file mode 100644 index 0000000..c24eb0b --- /dev/null +++ b/src/main/c/src/threadpool.c @@ -0,0 +1,45 @@ +#include +#include +#include +#include +#include +#include + +#include "../includes/libfluidsim.h" +#include "../includes/threadpool.h" + + +/** + * Main loops for the thread +*/ +void * main_thread_loop(void * data); + +/* + * Class: electrosphere_FluidSim + * Method: createThreadpool + * Signature: (I)J + */ +JNIEXPORT jlong JNICALL Java_electrosphere_FluidSim_createThreadpool + (JNIEnv * env, + jclass class, + jint numThreads){ + ThreadPool * pool = (ThreadPool *)malloc(sizeof(ThreadPool)); + pool->threads = (pthread_t *)malloc(sizeof(pthread_t) * numThreads); + pool->numThreads = numThreads; + int retCode = 0; + for(int i = 0; i < pool->numThreads; i++){ + retCode = pthread_create(&pool->threads[i], NULL, main_thread_loop, NULL); + // printf("thread ret code %d\n",retCode); + } + + for(int i = 0; i < pool->numThreads; i++){ + pthread_join(pool->threads[i], NULL); + printf("resolve thread\n"); + } +} + + +void * main_thread_loop(void * data){ + printf("thread work\n"); + sleep(1); +} \ No newline at end of file diff --git a/src/main/java/electrosphere/FluidSim.java b/src/main/java/electrosphere/FluidSim.java index 862dfff..5d4c178 100644 --- a/src/main/java/electrosphere/FluidSim.java +++ b/src/main/java/electrosphere/FluidSim.java @@ -70,6 +70,8 @@ public class FluidSim { float[] w0ArrayView = new float[DIM * DIM * DIM]; int chunkMask = 0; + + public static long threadpool; static final float DIFFUSION_CONSTANT = 0.0f; @@ -849,6 +851,12 @@ public class FluidSim { private native void copyNeighbors(int DIM_X, int chunkMask, int x, int vectorDir, ByteBuffer[] neighborMap); + public static long createThreadpoolWrapper(int numThreads){ + return createThreadpool(numThreads); + } + private static native long createThreadpool(int numThreads); + + diff --git a/src/main/java/electrosphere/Main.java b/src/main/java/electrosphere/Main.java index ce8ce63..d6f8c35 100644 --- a/src/main/java/electrosphere/Main.java +++ b/src/main/java/electrosphere/Main.java @@ -83,6 +83,8 @@ public class Main { } private static FluidSim[][][] initFluidSim(int dimx, int dimy, int dimz){ + FluidSim.threadpool = FluidSim.createThreadpoolWrapper(5); + FluidSim[][][] simArray = new FluidSim[dimx][dimy][dimz]; for(int x = 0; x < simArray.length; x++){ for(int y = 0; y < simArray[0].length; y++){