From 567ad614651f4eacc617cb052b03c5a800a5f17e Mon Sep 17 00:00:00 2001 From: jpekkila Date: Fri, 2 Aug 2019 13:54:54 +0300 Subject: [PATCH] Multinode MPI implementation should be done later in its own branch. The focus of this branch is to revise the node and device layers. Commented out references to the Grid layer. --- include/astaroth.h | 25 +++++++++++++++- src/core/astaroth.cu | 71 +++++++++++++++++++++++++++++++++++++++++++- src/core/grid.cu | 32 ++++++++++++++++---- 3 files changed, 120 insertions(+), 8 deletions(-) diff --git a/include/astaroth.h b/include/astaroth.h index 9befcee..fbfdb05 100644 --- a/include/astaroth.h +++ b/include/astaroth.h @@ -25,9 +25,10 @@ extern "C" { #include "astaroth_defines.h" #include "astaroth_device.h" -#include "astaroth_grid.h" #include "astaroth_node.h" +/* +#include "astaroth_grid.h" #define acInit(x) acGridInit(x) #define acQuit() acGridQuit() #define acLoad(x) acGridLoadMesh(STREAM_DEFAULT, x) @@ -38,6 +39,28 @@ extern "C" { #define acStore(x) acGridStoreMesh(STREAM_DEFAULT, x) #define acSynchronizeStream(x) acGridSynchronizeStream(x) #define acLoadDeviceConstant(x, y) acGridLoadConstant(STREAM_DEFAULT, x, y) +*/ + +AcResult acInit(const AcMeshInfo mesh_info); + +AcResult acQuit(void); + +AcResult acSynchronizeStream(const Stream stream); + +AcResult acLoadDeviceConstant(const AcRealParam param, const AcReal value); + +AcResult acLoad(const AcMesh host_mesh); + +AcResult acStore(AcMesh* host_mesh); + +AcResult acIntegrate(const AcReal dt); + +AcResult acBoundcondStep(void); + +AcReal acReduceScal(const ReductionType rtype, const VertexBufferHandle vtxbuf_handle); + +AcReal acReduceVec(const ReductionType rtype, const VertexBufferHandle a, + const VertexBufferHandle b, const VertexBufferHandle c); #ifdef __cplusplus } // extern "C" diff --git a/src/core/astaroth.cu b/src/core/astaroth.cu index 5de6d24..8ea0d68 100644 --- a/src/core/astaroth.cu +++ b/src/core/astaroth.cu @@ -16,7 +16,8 @@ You should have received a copy of the GNU General Public License along with Astaroth. If not, see . */ -#include "astaroth_defines.h" +// #include "astaroth_defines.h" +#include "astaroth.h" #define AC_GEN_STR(X) #X const char* intparam_names[] = {AC_FOR_BUILTIN_INT_PARAM_TYPES(AC_GEN_STR) // @@ -29,3 +30,71 @@ const char* real3param_names[] = {AC_FOR_BUILTIN_REAL3_PARAM_TYPES(AC_GEN_STR) / AC_FOR_USER_REAL3_PARAM_TYPES(AC_GEN_STR)}; const char* vtxbuf_names[] = {AC_FOR_VTXBUF_HANDLES(AC_GEN_STR)}; #undef AC_GEN_STR + +static const int num_nodes = 1; +static Node nodes[num_nodes]; + +AcResult +acInit(const AcMeshInfo mesh_info) +{ + return acNodeCreate(0, mesh_info, &nodes[0]); +} + +AcResult +acQuit(void) +{ + return acNodeDestroy(nodes[0]); +} + +AcResult +acSynchronizeStream(const Stream stream) +{ + return acNodeSynchronizeStream(nodes[0], stream); +} + +AcResult +acLoadDeviceConstant(const AcRealParam param, const AcReal value) +{ + return acNodeLoadConstant(nodes[0], STREAM_DEFAULT, param, value); +} + +AcResult +acLoad(const AcMesh host_mesh) +{ + return acNodeLoadMesh(nodes[0], STREAM_DEFAULT, host_mesh); +} + +AcResult +acStore(AcMesh* host_mesh) +{ + return acNodeStoreMesh(nodes[0], STREAM_DEFAULT, host_mesh); +} + +AcResult +acIntegrate(const AcReal dt) +{ + return acNodeIntegrate(nodes[0], dt); +} + +AcResult +acBoundcondStep(void) +{ + return acNodePeriodicBoundconds(nodes[0], STREAM_DEFAULT); +} + +AcReal +acReduceScal(const ReductionType rtype, const VertexBufferHandle vtxbuf_handle) +{ + AcReal result; + acNodeReduceScal(nodes[0], STREAM_DEFAULT, rtype, vtxbuf_handle, &result); + return result; +} + +AcReal +acReduceVec(const ReductionType rtype, const VertexBufferHandle a, const VertexBufferHandle b, + const VertexBufferHandle c) +{ + AcReal result; + acNodeReduceVec(nodes[0], STREAM_DEFAULT, rtype, a, b, c, &result); + return result; +} diff --git a/src/core/grid.cu b/src/core/grid.cu index 7a05d22..359fe00 100644 --- a/src/core/grid.cu +++ b/src/core/grid.cu @@ -30,6 +30,7 @@ acGridInit(const AcMeshInfo node_config) { acNodeCreate(0, node_config, &nodes[0]); ++num_nodes; + WARNING("Proper multinode not yet implemented"); return AC_FAILURE; } @@ -39,6 +40,7 @@ acGridQuit(void) { acNodeDestroy(nodes[0]); --num_nodes; + WARNING("Proper multinode not yet implemented"); return AC_FAILURE; } @@ -46,7 +48,10 @@ acGridQuit(void) AcResult acGridSynchronizeStream(const Stream stream) { - WARNING("Not implemented"); + for (int i = 0; i < num_nodes; ++i) { + acNodeSynchronizeStream(nodes[i], stream); + } + WARNING("Proper multinode not yet implemented"); return AC_FAILURE; } @@ -54,7 +59,10 @@ acGridSynchronizeStream(const Stream stream) AcResult acGridSwapBuffers(void) { - WARNING("Not implemented"); + for (int i = 0; i < num_nodes; ++i) { + acNodeSwapBuffers(nodes[i]); + } + WARNING("Proper multinode not yet implemented"); return AC_FAILURE; } @@ -62,7 +70,10 @@ acGridSwapBuffers(void) AcResult acGridLoadConstant(const Stream stream, const AcRealParam param, const AcReal value) { - WARNING("Not implemented"); + for (int i = 0; i < num_nodes; ++i) { + acNodeLoadConstant(node, stream, param, value); + } + WARNING("Proper multinode not yet implemented"); return AC_FAILURE; } @@ -72,7 +83,10 @@ acGridLoadVertexBufferWithOffset(const Stream stream, const AcMesh host_mesh, const VertexBufferHandle vtxbuf_handle, const int3 src, const int3 dst, const int num_vertices) { - WARNING("Not implemented"); + for (int i = 0; i < num_nodes; ++i) { + acNodeLoadVertexBufferWithOffset(node, stream, host_mesh, vtxbuf_handle) + } + WARNING("Proper multinode not yet implemented"); return AC_FAILURE; } @@ -81,7 +95,10 @@ AcResult acGridLoadMeshWithOffset(const Stream stream, const AcMesh host_mesh, const int3 src, const int3 dst, const int num_vertices) { - WARNING("Not implemented"); + for (int i = 0; i < num_nodes; ++i) { + acNodeLoadMeshWithOffset(nodes[i], stream, host_mesh, src, dst, num_vertices); + } + WARNING("Proper multinode not yet implemented"); return AC_FAILURE; } @@ -90,7 +107,10 @@ AcResult acGridLoadVertexBuffer(const Stream stream, const AcMesh host_mesh, const VertexBufferHandle vtxbuf_handle) { - WARNING("Not implemented"); + for (int i = 0; i < num_nodes; ++i) { + acNodeLoadVertexBuffer(node, stream, host_mesh, vtxbuf_handle); + } + WARNING("Proper multinode not yet implemented"); return AC_FAILURE; }