Skip to content

Commit

Permalink
Move cuda instantiations in a plugin (#132)
Browse files Browse the repository at this point in the history
* Introduce CUDA extension

* Move cuda instantiations in an plugin

* Change folder hierarchy according to the guidelines
  • Loading branch information
alxbilger authored Feb 7, 2024
1 parent 40ed0c6 commit 7444f8c
Show file tree
Hide file tree
Showing 7 changed files with 191 additions and 30 deletions.
14 changes: 2 additions & 12 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ sofa_find_package(Sofa.Component.Constraint.Projective REQUIRED)
sofa_find_package(Sofa.Component.Constraint.Lagrangian REQUIRED)
sofa_find_package(SofaImplicitField QUIET)
sofa_find_package(SofaAdvancedConstraint QUIET)
sofa_find_package(SofaCUDA QUIET)

set(BEAMADAPTER_SRC "src/${PROJECT_NAME}")

Expand Down Expand Up @@ -138,14 +137,6 @@ if(SofaAdvancedConstraint_FOUND)
#cuda_add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES} ${CUDA_SOURCES})
endif()


if(SofaCUDA_FOUND)
list (APPEND SOURCE_FILES
${BEAMADAPTER_SRC}/gpu/cuda/CudaInstantiations.cpp
)
message(STATUS "BeamAdapter: SofaCUDA has been enabled, instantiations for CudaTypes will be enabled.")
endif()

add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES} ${README_FILES})

target_link_libraries(${PROJECT_NAME} PUBLIC Sofa.Simulation.Core)
Expand All @@ -158,9 +149,6 @@ endif()
if(SofaAdvancedConstraint_FOUND)
target_link_libraries(${PROJECT_NAME} PUBLIC SofaAdvancedConstraint)
endif()
if(SofaCUDA_FOUND)
target_link_libraries(${PROJECT_NAME} PUBLIC SofaCUDA)
endif()

sofa_create_package_with_targets(
PACKAGE_NAME ${PROJECT_NAME}
Expand Down Expand Up @@ -196,4 +184,6 @@ SET_PROPERTY(TARGET ${PROJECT_NAME} PROPERTY FOLDER "plugins")
# Config files and install rules for pythons scripts
sofa_install_pythonscripts(PLUGIN_NAME ${PROJECT_NAME} PYTHONSCRIPTS_SOURCE_DIR "python")

sofa_add_subdirectory(plugin extensions/CUDA BeamAdapter.CUDA)

include(cmake/packaging.cmake)
9 changes: 9 additions & 0 deletions extensions/CUDA/BeamAdapter.CUDAConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# CMake package configuration file for the BeamAdapter.CUDA library

@PACKAGE_GUARD@
@PACKAGE_INIT@

find_package(BeamAdapter QUIET REQUIRED)
find_package(SofaCUDA QUIET REQUIRED)

check_required_components(BeamAdapter.CUDA)
28 changes: 28 additions & 0 deletions extensions/CUDA/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
cmake_minimum_required(VERSION 3.12)
project(BeamAdapter.CUDA)

set(HEADER_FILES
src/BeamAdapter/CUDA/init.h
src/BeamAdapter/CUDA/config.h.in
)

set(SOURCE_FILES
src/BeamAdapter/CUDA/init.cpp
src/BeamAdapter/CUDA/CudaInstantiations.cpp
)

sofa_find_package(BeamAdapter REQUIRED)
sofa_find_package(SofaCUDA REQUIRED)

add_library(${PROJECT_NAME} SHARED ${HEADER_FILES} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} BeamAdapter)
target_link_libraries(${PROJECT_NAME} SofaCUDA)

sofa_create_package_with_targets(
PACKAGE_NAME ${PROJECT_NAME}
PACKAGE_VERSION ${Sofa_VERSION}
TARGETS ${PROJECT_NAME} AUTO_SET_TARGET_PROPERTIES
INCLUDE_SOURCE_DIR "src"
INCLUDE_INSTALL_DIR "${PROJECT_NAME}"
RELOCATABLE "plugins"
)
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
* *
* Contact information: [email protected] *
******************************************************************************/
#include <BeamAdapter/CUDA/config.h>
#include <SofaCUDA/sofa/gpu/cuda/CudaTypes.h>

#include <BeamAdapter/component/WireBeamInterpolation.inl>
Expand All @@ -43,62 +44,62 @@ using namespace sofa::gpu::cuda;

namespace sofa::component::fem::_beaminterpolation_
{
// template class SOFA_BEAMADAPTER_API BeamInterpolation<CudaRigid3fTypes>;
// template class SOFA_BEAMADAPTER_CUDA_API BeamInterpolation<CudaRigid3fTypes>;
#ifdef SOFA_GPU_CUDA_DOUBLE
template class SOFA_BEAMADAPTER_API BeamInterpolation<CudaRigid3dTypes>;
template class SOFA_BEAMADAPTER_CUDA_API BeamInterpolation<CudaRigid3dTypes>;
#endif
} // namespace sofa::component::fem::_beaminterpolation_

namespace sofa::component::fem::_wirebeaminterpolation_
{
// template class SOFA_BEAMADAPTER_API WireBeamInterpolation<CudaRigid3fTypes>;
// template class SOFA_BEAMADAPTER_CUDA_API WireBeamInterpolation<CudaRigid3fTypes>;
#ifdef SOFA_GPU_CUDA_DOUBLE
template class SOFA_BEAMADAPTER_API WireBeamInterpolation<CudaRigid3dTypes>;
template class SOFA_BEAMADAPTER_CUDA_API WireBeamInterpolation<CudaRigid3dTypes>;
#endif
} // namespace sofa::component::fem::_beaminterpolation_

namespace sofa::component::engine::_wirerestshape_
{
template class SOFA_BEAMADAPTER_API WireRestShape<CudaRigid3fTypes>;
template class SOFA_BEAMADAPTER_CUDA_API WireRestShape<CudaRigid3fTypes>;
#ifdef SOFA_GPU_CUDA_DOUBLE
template class SOFA_BEAMADAPTER_API WireRestShape<CudaRigid3dTypes>;
template class SOFA_BEAMADAPTER_CUDA_API WireRestShape<CudaRigid3dTypes>;
#endif
} // namespace sofa::component::engine::_wirerestshape_

namespace sofa::component::controller::_interventionalradiologycontroller_
{
template class SOFA_BEAMADAPTER_API InterventionalRadiologyController<CudaRigid3fTypes>;
template class SOFA_BEAMADAPTER_CUDA_API InterventionalRadiologyController<CudaRigid3fTypes>;
#ifdef SOFA_GPU_CUDA_DOUBLE
template class SOFA_BEAMADAPTER_API InterventionalRadiologyController<CudaRigid3dTypes>;
template class SOFA_BEAMADAPTER_CUDA_API InterventionalRadiologyController<CudaRigid3dTypes>;
#endif
} // namespace sofa::component::controller::_interventionalradiologycontroller_

namespace sofa::component::mapping::_adaptivebeammapping_
{
template class SOFA_BEAMADAPTER_API AdaptiveBeamMapping<CudaRigid3fTypes, defaulttype::Vec3Types>;
template class SOFA_BEAMADAPTER_CUDA_API AdaptiveBeamMapping<CudaRigid3fTypes, defaulttype::Vec3Types>;
#ifdef SOFA_GPU_CUDA_DOUBLE
template class SOFA_BEAMADAPTER_API AdaptiveBeamMapping<CudaRigid3dTypes, defaulttype::Vec3Types>;
template class SOFA_BEAMADAPTER_CUDA_API AdaptiveBeamMapping<CudaRigid3dTypes, defaulttype::Vec3Types>;
#endif
} // namespace sofa::component::mapping::_adaptivebeammapping_

namespace sofa::component::mapping
{
template class SOFA_BEAMADAPTER_API MultiAdaptiveBeamMapping<CudaRigid3fTypes, defaulttype::Vec3Types>;
template class SOFA_BEAMADAPTER_CUDA_API MultiAdaptiveBeamMapping<CudaRigid3fTypes, defaulttype::Vec3Types>;
#ifdef SOFA_GPU_CUDA_DOUBLE
template class SOFA_BEAMADAPTER_API MultiAdaptiveBeamMapping<CudaRigid3dTypes, defaulttype::Vec3Types>;
template class SOFA_BEAMADAPTER_CUDA_API MultiAdaptiveBeamMapping<CudaRigid3dTypes, defaulttype::Vec3Types>;
#endif
} // namespace sofa::component::mapping

namespace sofa::beamadapter
{
template class SOFA_BEAMADAPTER_API RodMeshSection<CudaRigid3fTypes>;
template class SOFA_BEAMADAPTER_API RodSpireSection<CudaRigid3fTypes>;
template class SOFA_BEAMADAPTER_API RodStraightSection<CudaRigid3fTypes>;
template class SOFA_BEAMADAPTER_CUDA_API RodMeshSection<CudaRigid3fTypes>;
template class SOFA_BEAMADAPTER_CUDA_API RodSpireSection<CudaRigid3fTypes>;
template class SOFA_BEAMADAPTER_CUDA_API RodStraightSection<CudaRigid3fTypes>;

#ifdef SOFA_GPU_CUDA_DOUBLE
template class SOFA_BEAMADAPTER_API RodMeshSection<CudaRigid3dTypes>;
template class SOFA_BEAMADAPTER_API RodSpireSection<CudaRigid3dTypes>;
template class SOFA_BEAMADAPTER_API RodStraightSection<CudaRigid3dTypes>;
template class SOFA_BEAMADAPTER_CUDA_API RodMeshSection<CudaRigid3dTypes>;
template class SOFA_BEAMADAPTER_CUDA_API RodSpireSection<CudaRigid3dTypes>;
template class SOFA_BEAMADAPTER_CUDA_API RodStraightSection<CudaRigid3dTypes>;
#endif
} // namespace sofa::beamadapter

Expand Down
37 changes: 37 additions & 0 deletions extensions/CUDA/src/BeamAdapter/CUDA/config.h.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/******************************************************************************
* BeamAdapter plugin *
* (c) 2006 Inria, University of Lille, CNRS *
* *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation; either version 2.1 of the License, or (at *
* your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
* for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
*******************************************************************************
* Authors: see Authors.md *
* *
* Contact information: [email protected] *
******************************************************************************/
#pragma once

#include <sofa/config.h>

#ifdef SOFA_BUILD_BEAMADAPTER_CUDA
# define SOFA_TARGET @PROJECT_NAME@
# define SOFA_BEAMADAPTER_CUDA_API SOFA_EXPORT_DYNAMIC_LIBRARY
#else
# define SOFA_BEAMADAPTER_CUDA_API SOFA_IMPORT_DYNAMIC_LIBRARY
#endif

namespace beamadapter::cuda
{
constexpr const char* MODULE_NAME = "@PROJECT_NAME@";
constexpr const char* MODULE_VERSION = "@PROJECT_VERSION@";
} // namespace beamadapter::cuda
67 changes: 67 additions & 0 deletions extensions/CUDA/src/BeamAdapter/CUDA/init.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/******************************************************************************
* BeamAdapter plugin *
* (c) 2006 Inria, University of Lille, CNRS *
* *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation; either version 2.1 of the License, or (at *
* your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
* for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
*******************************************************************************
* Authors: see Authors.md *
* *
* Contact information: [email protected] *
******************************************************************************/
#include <BeamAdapter/CUDA/init.h>
#include <BeamAdapter/initBeamAdapter.h>
#include <sofa/core/ObjectFactory.h>
namespace beamadapter::cuda
{

extern "C" {
SOFA_EXPORT_DYNAMIC_LIBRARY void initExternalModule();
SOFA_EXPORT_DYNAMIC_LIBRARY const char* getModuleName();
SOFA_EXPORT_DYNAMIC_LIBRARY const char* getModuleVersion();
SOFA_EXPORT_DYNAMIC_LIBRARY const char* getModuleComponentList();
}

void initExternalModule()
{
init();
}

const char* getModuleName()
{
return MODULE_NAME;
}

const char* getModuleVersion()
{
return MODULE_VERSION;
}

void init()
{
static bool first = true;
if (first)
{
sofa::component::initBeamAdapter();
first = false;
}
}

const char* getModuleComponentList()
{
/// string containing the names of the classes provided by the plugin
static std::string classes = sofa::core::ObjectFactory::getInstance()->listClassesFromTarget(MODULE_NAME);
return classes.c_str();
}

} // namespace beamadapter::cuda
29 changes: 29 additions & 0 deletions extensions/CUDA/src/BeamAdapter/CUDA/init.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/******************************************************************************
* BeamAdapter plugin *
* (c) 2006 Inria, University of Lille, CNRS *
* *
* This program is free software; you can redistribute it and/or modify it *
* under the terms of the GNU Lesser General Public License as published by *
* the Free Software Foundation; either version 2.1 of the License, or (at *
* your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, but WITHOUT *
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or *
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License *
* for more details. *
* *
* You should have received a copy of the GNU Lesser General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/>. *
*******************************************************************************
* Authors: see Authors.md *
* *
* Contact information: [email protected] *
******************************************************************************/
#pragma once

#include <BeamAdapter/CUDA/config.h>

namespace beamadapter::cuda
{
SOFA_BEAMADAPTER_CUDA_API void init();
} // namespace beamadapter::cuda

0 comments on commit 7444f8c

Please sign in to comment.