From b79587072fd4bfa12a2a49feab84bf3571efad2d Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Tue, 1 Dec 2020 14:10:15 -0600 Subject: [PATCH] added openmp implementation --- Makefile | 16 ++- sim_omp | Bin 0 -> 149176 bytes sim_seq | Bin 144720 -> 144720 bytes src/sim_omp.cpp | 354 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 364 insertions(+), 6 deletions(-) create mode 100755 sim_omp create mode 100644 src/sim_omp.cpp diff --git a/Makefile b/Makefile index 813c05e..d75906b 100644 --- a/Makefile +++ b/Makefile @@ -17,29 +17,33 @@ INCLUDES=-I./include LIBS=-lGL -lglfw -lm -lpthread PTH_TARGET=./sim SEQ_TARGET=./sim_seq +OMP_TARGET=./sim_omp ifeq ($(RELEASE), 1) - FLAGS=-O3 + FLAGS=-O3 -fopenmp else - FLAGS=-g3 + FLAGS=-g3 -fopenmp endif lib/%.o: lib/%.c $(CC) $(FLAGS) -c $< -o $@ $(INCLUDES) build/%.o: src/%.cpp - $(CC) $(FLAGS) -c $< -o $@ $(INCLUDES) + $(CC) -std=c++2a $(FLAGS) -c $< -o $@ $(INCLUDES) build/%.o: src/%.c $(CC) $(FLAGS) -c $< -o $@ $(INCLUDES) $(PTH_TARGET): $(OBJ_FILES) build/sim.o $(LIB_FILES) - $(CC) $(FLAGS) $(OBJ_FILES) build/sim.o $(LIB_FILES) -o $@ $(LIBS) + $(CC) -std=c++2a $(FLAGS) $(OBJ_FILES) build/sim.o $(LIB_FILES) -o $@ $(LIBS) $(SEQ_TARGET): $(OBJ_FILES) build/sim_seq.o $(LIB_FILES) - $(CC) $(FLAGS) $(OBJ_FILES) build/sim_seq.o $(LIB_FILES) -o $@ $(LIBS) + $(CC) -std=c++2a $(FLAGS) $(OBJ_FILES) build/sim_seq.o $(LIB_FILES) -o $@ $(LIBS) + +$(OMP_TARGET): $(OBJ_FILES) build/sim_omp.o $(LIB_FILES) + $(CC) -fopenmp -std=c++2a $(FLAGS) $(OBJ_FILES) build/sim_omp.o $(LIB_FILES) -o $@ $(LIBS) clean: rm -f $(OBJ_FILES) 2>&1 >/dev/null -all: ./sim ./sim_seq +all: ./sim ./sim_seq ./sim_omp diff --git a/sim_omp b/sim_omp new file mode 100755 index 0000000000000000000000000000000000000000..1d898823040defda7527b1e66c8c118d141af414 GIT binary patch literal 149176 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 literal 0 HcmV?d00001 diff --git a/sim_seq b/sim_seq index fcfc2c41a180bd982ab8a108869d4085b7d4656a..b5823647c292d3ba5113972e9701df11c1e81a83 100755 GIT binary patch delta 844 zcmZ`&O=uHQ5T1G4*4-4fn~hylkfacbJ(v(JhzLq@(Sq1iQdt$O$Bm#}@dta+iU$+? zso|BrT#J_k1dBZ^dJx1zPGX9v?PMZ<*szk|pv(`9ln zbRu27^7g^vo7sE$Z||ht&#fD;jHRgbXq!BB!HQp=iYMs{^>h~yAgnk-G#U>+4kI9p zaG`x%MU;P;q3K=#8IIBK!3bt)Sc{yR6!EJAIR!w1^I|aMepiG|2+34T5fdDf&aHJz5VJ|(c|E%rKH*L0j&QbNt%r_qbs z$f~tQeQIK~&`M=fg&z|~@9)Xl>JvP2h?#3xQr&Ug z;}r!+Gi+c24VG+R1Wh*Hz%jhb78*FIIw6m{#WPT1Y7-Bm!^WGO8)KK6IE#53KVwzm z@Y5IEA<5vljvg*)BI_?BL4b$VulRvC#1^NApyTNCE$o;2!D7i4>X`2Y?XxW$=;4~C zH#!O{uCeU;23C<%7TUavDfZ_#IS_C?Ue#W1VNp?8zHkP z=l6lP^0n5TWN{NcQ0(xvzx8|}`gCRfQL1rh?)CmNu|`6AJWQKPK_Wm{?HEz%snKU~za#>}LEdDT!vx>? z1B*idA(*77#&L=!)%en!;BSl>GJpgZ#8Aln3BkFiMGRv%zyKH`_MrA~5MT#f@5?8@ z@`K9?xygLJOZm1Wu1Cb_TUCyg`(scN+6rA$wbPliMxbZt0j<+I!_JK=ypD`YBt;RlC`9+3JtN^u5EEZDj?gPV>YtTi8SkCm6O- z$0AF&F^*+6+r}BZ$(GxANpT{6+dF*&CQ~{%i4L3XaBY-b>)?H~Z2W?&5{GNwaE}xM z$91%rsfw&Wj0C$lt$fGNydZYDJOZAh@yZ^KLWQNfsG;Ry`(hWz206L7?KN3a$Tcu9M@kBcQ_!7Y41GtnRU5Y{y>b pkjTMn7TNd_uKo=T7Y60atnR{!c(4jv=THegLhwN{cKRrZlb^T7!yW(t diff --git a/src/sim_omp.cpp b/src/sim_omp.cpp new file mode 100644 index 0000000..b8c128f --- /dev/null +++ b/src/sim_omp.cpp @@ -0,0 +1,354 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "types.h" +#include "container.h" +#include "utils.h" +#include "physics.h" +#include "ui.h" +#include "log.h" +#include "settings.h" + +// TODO(Brendan): Maybe this can be removed because it isn't really necessary? +internal void +glfw_key_handler(GLFWwindow* window, i32 key, i32 scancode, i32 action, i32 mods) +{ + if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS) + glfwSetWindowShouldClose(window, 1); + + if (key == GLFW_KEY_F && action == GLFW_PRESS) + { + persist bool is_fullscreen = false; + is_fullscreen = !is_fullscreen; + + if (is_fullscreen) + { + GLFWmonitor* primary_mon = glfwGetPrimaryMonitor(); + const GLFWvidmode* vidmode = glfwGetVideoMode(primary_mon); + glfwSetWindowMonitor(window, primary_mon, 0, 0, vidmode->width, vidmode->height, GLFW_DONT_CARE); + } + else + { + glfwSetWindowMonitor(window, NULL, 0, 0, 800, 600, GLFW_DONT_CARE); + } + } +} + +internal void +glfw_error_handler(i32 error, const char* desc) +{ + panic_and_die("GLFW Error (%d): %s\n", error, desc); +} + +GLFWwindow* window; +internal void +init_glfw() +{ + logprint(LOG_LEVEL_INFO, "Initializing GLFW"); + + if (!glfwInit()) panic_and_die("Failed to initalize GLFW."); + glfwSetErrorCallback(glfw_error_handler); + + window = glfwCreateWindow(1600, 900, "N-Body Simulation", NULL, NULL); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); + glfwMakeContextCurrent(window); + + glfwSwapInterval(1); + glfwSetKeyCallback(window, glfw_key_handler); + + // NOTE(Brendan): This may need to be changed if the screen orientation changes. + glEnable(GL_CULL_FACE); + glFrontFace(GL_CW); + glCullFace(GL_BACK); + + glEnable(GL_TEXTURE_2D); + + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); +} + +internal void +deinit_glfw() +{ + glfwDestroyWindow(window); + glfwTerminate(); +} + +#define CIRCLE_POINT_COUNT 12 // NOTE(Brendan): Treat a circle as a many-sided polygon. + +// NOTE(Brendan): Returns the VAO where the mesh data was bound. +internal GLuint +create_circle_mesh() +{ + logprint(LOG_LEVEL_INFO, "Generating circle mesh"); + + GLuint vao; + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + + V2f circle_points[CIRCLE_POINT_COUNT] = {}; + foreach (i, 0, CIRCLE_POINT_COUNT) + { + f32 t = (f32) i / (f32) CIRCLE_POINT_COUNT; + circle_points[i].x = cos(t * 2 * 3.1415926535897); + circle_points[i].y = sin(t * 2 * 3.1415926535897); + } + + GLuint vertex_buffer; + glGenBuffers(1, &vertex_buffer); + glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer); + glBufferData(GL_ARRAY_BUFFER, sizeof(circle_points), &circle_points, GL_STATIC_DRAW); + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 2, GL_FLOAT, false, sizeof(V2f), (void *) offsetof(V2f, x)); + glBindBuffer(GL_ARRAY_BUFFER, -1); + + u8 circle_indicies[CIRCLE_POINT_COUNT] = {}; + foreach(i, 0, CIRCLE_POINT_COUNT) circle_indicies[i] = i; + + GLuint index_buffer; + glGenBuffers(1, &index_buffer); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(circle_indicies), &circle_indicies, GL_STATIC_DRAW); + + glBindVertexArray(-1); + + return vao; +} + +struct SimState; +struct ThreadData +{ + i32 id; + SimState* state; +}; + +struct SimState +{ + Array bodies; + QuadTree qt_bodies; + FixedArenaAllocator> qt_body_allocator; + + Camera camera; +}; + +// @CLEANUP +internal f64 TEMP_dt = 0; + +internal void +sim_state_init(SimState* state) +{ + // NOTE(Brendan): Need to initialize the array since it does not get constructed because I refuse to use the 'new' keyword. alloc uses malloc under the hood and cannot initialize the result. + state->bodies.init(global_settings.body_count); + + foreach (i, 0, global_settings.body_count) + { + Body tmp_body; + tmp_body.body_type = (rand() % global_settings.body_type_count); + tmp_body.pos = V2f{ randf(-1000, 1000), randf(-1000, 1000) }; + tmp_body.vel = V2f{ 0.0f, 0.0f }; + + BodyMassRange bmr = global_settings.body_mass_range[tmp_body.body_type]; + tmp_body.mass = randf(bmr.min, bmr.max); + + state->bodies.push(tmp_body); + } + + state->qt_body_allocator.init(global_settings.body_count); + state->qt_bodies.init(AABB { -2000, -2000, 4000, 4000 }); + + state->camera.scale = 1.0f; +} + +// NOTE CLEANUP(Brendan): Bunch of graphics state that should go elsewhere. +internal GLuint body_buffer; +internal GLuint circle_mesh; +internal GLuint body_program; + +// TEMPORARY +internal i32 frame_rate = 0; + +internal void +draw(SimState* state) +{ + // NOTE(Brendan): Rebuffer all the body data to the GPU. + glBindBuffer(GL_ARRAY_BUFFER, body_buffer); + glBufferSubData(GL_ARRAY_BUFFER, 0, state->bodies.size_in_bytes(), state->bodies.data); + glBindBuffer(GL_ARRAY_BUFFER, -1); + + glUseProgram(body_program); + + mat4 ortho_mat; + camera_ortho_mat4(state->camera, &ortho_mat); + GLuint ortho_mat_loc = glGetUniformLocation(body_program, "u_proj"); + glUniformMatrix4fv(ortho_mat_loc, 1, false, (f32 *) ortho_mat); + glViewport(0, 0, state->camera.window_width, state->camera.window_height); + + mat4 camera_mat; + camera_world_mat4(state->camera, &camera_mat); + GLuint camera_mat_loc = glGetUniformLocation(body_program, "u_camera"); + glUniformMatrix4fv(camera_mat_loc, 1, false, (f32 *) camera_mat); + + // NOTE(Brendan): Clear the screen. + glClearColor(0.1, 0.1, 0.1, 1.0); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // NOTE(Brendan): Draw the bodies. + glBindVertexArray(circle_mesh); + glDrawElementsInstanced(GL_TRIANGLE_FAN, CIRCLE_POINT_COUNT, GL_UNSIGNED_BYTE, 0, state->bodies.count); + glBindVertexArray(-1); + + font_set_projection_matrix(ortho_mat); + char fps_str[64]; + snprintf(fps_str, 63, "FPS: %d", frame_rate); + font_print(0, 32, fps_str); + + // NOTE(Brendan): Present the changes to the screen. + glfwSwapBuffers(window); +} + +internal void +loop(SimState* state) +{ + f64 last_time = glfwGetTime(); + f64 curr_time = last_time; + f64 delta = 0.0; + + f64 frame_delta = 0.0; + i32 frame_count = 0; + clock_t total_clock_delta = 0; + clock_t before_update, after_update; + +#pragma omp parallel + { + while (!glfwWindowShouldClose(window)) + { + #pragma omp master + { + curr_time = glfwGetTime(); + delta = curr_time - last_time; + last_time = curr_time; + + before_update = clock(); + + glfwGetWindowSize(window, &state->camera.window_width, &state->camera.window_height); + + persist const f32 camera_move_speed = 6; + if (glfwGetKey(window, GLFW_KEY_UP)) state->camera.offset.y -= camera_move_speed; + if (glfwGetKey(window, GLFW_KEY_DOWN)) state->camera.offset.y += camera_move_speed; + if (glfwGetKey(window, GLFW_KEY_LEFT)) state->camera.offset.x -= camera_move_speed; + if (glfwGetKey(window, GLFW_KEY_RIGHT)) state->camera.offset.x += camera_move_speed; + if (glfwGetKey(window, GLFW_KEY_Q)) state->camera.scale *= 1.02f; + if (glfwGetKey(window, GLFW_KEY_A)) state->camera.scale /= 1.02f; + + TEMP_dt = delta; + } + + #pragma omp for + for (int i = 0; i < global_settings.body_count; i++) + body_accumulate_move(&state->bodies[i], &state->qt_bodies, TEMP_dt); + + #pragma omp for + for (int i = 0; i < global_settings.body_count; i++) + body_apply_move(&state->bodies[i], TEMP_dt); + + #pragma omp master + { + after_update = clock(); + total_clock_delta += (after_update - before_update); + + frame_count += 1; + draw(state); + + frame_delta += delta; + if (frame_delta >= 1.0) + { + total_clock_delta = 0; + frame_delta -= 1.0; + frame_rate = frame_count; + frame_count = 0; + } + + glfwPollEvents(); + } + + #pragma omp single + { + state->qt_bodies.init(AABB { -2000, -2000, 4000, 4000 }); + state->qt_body_allocator.reset(); + For (state->bodies) state->qt_bodies.insert(&it, &state->qt_body_allocator); + } + } + } +} + +i32 +main(i32 argc, char* argv[]) +{ + srand(time(NULL)); + + if (argc > 1) + { + load_settings_from_file(&global_settings, argv[1]); + } + else + { + generate_random_settings(&global_settings); + } + + omp_set_num_threads(global_settings.thread_count); + + init_glfw(); + defer { deinit_glfw(); }; + + circle_mesh = create_circle_mesh(); + + init_font("res/font/Hack-Regular.ttf"); + + body_program = create_program(load_shader(GL_VERTEX_SHADER, "res/shaders/planet_vert.glsl"), + load_shader(GL_FRAGMENT_SHADER, "res/shaders/planet_frag.glsl")); + glUseProgram(body_program); + + GLuint planet_colors_loc = glGetUniformLocation(body_program, "u_planet_colors"); + GLfloat* planet_colors = (GLfloat *) global_settings.body_colors.data; + glUniform3fv(planet_colors_loc, global_settings.body_type_count, planet_colors); + + auto state = alloc(); + sim_state_init(state); + + // NOTE(Brendan): Other OpenGL initializations that could probably happen earlier. + { + glBindVertexArray(circle_mesh); + defer { glBindVertexArray(-1); }; + + glGenBuffers(1, &body_buffer); + glBindBuffer(GL_ARRAY_BUFFER, body_buffer); + glBufferData(GL_ARRAY_BUFFER, state->bodies.size_in_bytes(), state->bodies.data, GL_STREAM_DRAW); + + foreach (i, 1, 4) + { + glEnableVertexAttribArray(i); + glVertexAttribDivisor(i, 1); + } + glVertexAttribPointer(1, 2, GL_FLOAT, false, sizeof(Body), (void *) offsetof(Body, pos.x)); + glVertexAttribPointer(2, 1, GL_FLOAT, false, sizeof(Body), (void *) offsetof(Body, mass)); + glVertexAttribPointer(3, 1, GL_BYTE, false, sizeof(Body), (void *) offsetof(Body, body_type)); + + glBindBuffer(GL_ARRAY_BUFFER, -1); + } + + loop(state); + + return 0; +} -- 2.25.1