Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
47f4db9
simple CMake configuration to build a functional CPU version of the p…
roiser Feb 22, 2022
d72dcf6
docu
roiser Feb 22, 2022
bf9fb4a
generate P* CMakeLists.txt file
roiser Feb 24, 2022
13572d3
add CMakeLists.txt template files
roiser Feb 24, 2022
01edc03
add macros file
roiser Feb 24, 2022
29d1740
remove hardcoded pathes but do the same via a macro
roiser Feb 24, 2022
9b11529
add new macros file
roiser Feb 24, 2022
b002aba
add CMakeLists.txt files for the code generation
roiser Feb 24, 2022
f94f084
make library and executable names unique
roiser Feb 24, 2022
c107043
cosmetics
roiser Feb 24, 2022
8059b84
merge cmake branch
roiser Feb 24, 2022
f2ff328
first steps ...
roiser Feb 25, 2022
efb5e3a
ignore mac .DS_Store files
roiser Feb 28, 2022
a4ceb25
ignore build directory
roiser Feb 28, 2022
aa29cb4
ignore build directory
roiser Feb 28, 2022
ec7849d
introduce the scales to the bridge infrastructure (for CPU)
roiser Feb 28, 2022
49335ce
after discussion with Olivier, for the time being we don't pass the s…
roiser Mar 1, 2022
351e943
replace value for G with the static one generated in the standalone v…
roiser Mar 2, 2022
50c5a9c
next step of creating the infrastructure to calculate the dependent s…
roiser Mar 4, 2022
698fd81
comment out memcpy for now
roiser Mar 8, 2022
bc829b8
move calcDependencies into MatrixElementKernels
roiser Mar 8, 2022
1a4b9d9
call base
roiser Mar 8, 2022
4b84664
move the Gs to the MatrixElementKernelBase and calculate them inside …
roiser Mar 18, 2022
fdd60b9
undef hardcoding of params default
roiser Mar 25, 2022
e466fd6
change sources and headers to real files, add missing include dir, so…
roiser Mar 29, 2022
4c9aea9
Merge remote-tracking branch 'origin/cmake' into alphas
roiser Mar 29, 2022
def433a
Merge branch 'alphas'
roiser Mar 31, 2022
f54c85e
fix after merge
roiser Mar 31, 2022
4533996
clang-format the code
roiser Apr 1, 2022
a497e1a
enable ARM NEON (128 bit) vector registers via compiler defined macros
roiser Apr 4, 2022
8afd146
vector register for GC_XX
roiser Apr 4, 2022
be7690f
calculate GC_XX vectorised
roiser Apr 4, 2022
822c30b
pass vectorized calculated couplings from the bridge into the ME calc…
roiser Apr 5, 2022
03c2498
clang-format'ed
roiser Apr 5, 2022
c1c280d
remove old cIPC variable
roiser Apr 5, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,10 @@ test/googletest
*.local
*~
local/
**/build/
*.log
*.output
*.error
*.cobaltlog
*.BKP
.DS_Store
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
MACRO(SUBDIRLIST result)
FILE(GLOB children RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*)
SET(dirlist "")
FOREACH(child ${children})
IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${child})
LIST(APPEND dirlist ${child})
ENDIF()
ENDFOREACH()
SET(${result} ${dirlist})
ENDMACRO()
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
if (CMAKE_HOST_APPLE)
add_definitions(-DMGONGPU_HAS_NO_CURAND)
endif(CMAKE_HOST_APPLE)
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Minimal CMake configuration to build a functional CPU version

cmake_minimum_required(VERSION 3.22)

project(Madgraph4GPU)

include(${PROJECT_SOURCE_DIR}/CMake/Platforms.txt)
include(${PROJECT_SOURCE_DIR}/CMake/Compilers.txt)
include(${PROJECT_SOURCE_DIR}/CMake/Macros.txt)

set(PROJECT_GITROOT_DIR ${PROJECT_SOURCE_DIR}/../../..)

add_subdirectory(src)
add_subdirectory(SubProcesses)
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
SUBDIRLIST(SUBDIRS)
FOREACH(subdir ${SUBDIRS})
ADD_SUBDIRECTORY(${subdir})
ENDFOREACH()
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
get_filename_component(basename ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(TOLOWER ${basename} targadd)

file(GLOB_RECURSE HEADERS "*.h")

set(libname mg5amc_cxx_${targadd})
add_library(${libname} BridgeKernels.cc CPPProcess.cc CrossSectionKernels.cc MatrixElementKernels.cc
RamboSamplingKernels.cc RandomNumberKernels.cc ${HEADERS})
target_include_directories(${libname} PUBLIC "${PROJECT_SOURCE_DIR}/src"
"${PROJECT_GITROOT_DIR}/tools")

set(execname check_${targadd}.exe)
add_executable(${execname} check_sa.cc)
target_link_libraries(${execname} PUBLIC mg5amc_common ${libname})
target_include_directories(${execname} PRIVATE "${PROJECT_SOURCE_DIR}/src")
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
file(GLOB_RECURSE HEADERS "*.h")
add_library(mg5amc_common Parameters_sm.cc read_slha.cc ${HEADERS})
Original file line number Diff line number Diff line change
Expand Up @@ -937,7 +937,7 @@ def get_process_function_definitions(self, write=True):
if len(self.params2order) == 0: # remove all IPD occurrences (issue #349)
file_lines = file.split('\n')
file_lines = [l.replace('cIPC,cIPD','cIPC') for l in file_lines] # remove cIPD from OpenMP pragma
file_lines = [l for l in file_lines if 'IPD' not in l] # remove all other lines matchin IPD
file_lines = [l for l in file_lines if 'IPD' not in l] # remove all other lines matchin IPD
file = '\n'.join( file_lines )
return file

Expand Down Expand Up @@ -1054,6 +1054,7 @@ def generate_process_files(self):
self.matrix_elements[0].set('has_mirror_process', False)
self.nprocesses/=2
super(export_cpp.OneProcessExporterGPU, self).generate_process_files()
self.edit_CMakeLists()
self.edit_check_sa()
self.edit_mgonGPU()
self.edit_processidfile() # AV new file (NB this is Sigma-specific, should not be a symlink to Subprocesses)
Expand All @@ -1067,6 +1068,16 @@ def generate_process_files(self):
files.ln(pjoin(self.path, 'RandomNumberKernels.cc'), self.path, 'gRandomNumberKernels.cu')
files.ln(pjoin(self.path, 'BridgeKernels.cc'), self.path, 'gBridgeKernels.cu')


# sr - generate CMakeLists.txt file inside the P* directory
def edit_CMakeLists(self):
"""Generate CMakeLists.txt"""
misc.sprint('Entering PLUGIN_OneProcessExporter.edit_CMakeLists')
template = open(pjoin(self.template_path,'gpu','CMakeLists_P.txt'),'r').read()
ff = open(pjoin(self.path, 'CMakeLists.txt'),'w')
ff.write(template)
ff.close()

# AV - replace the export_cpp.OneProcessExporterGPU method (invert .cc/.cu, add debug printouts)
def edit_check_sa(self):
"""Generate check_sa.cc and fcheck_sa.f"""
Expand Down
32 changes: 18 additions & 14 deletions epochX/cudacpp/CODEGEN/PLUGIN/CUDACPP_SA_OUTPUT/output.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,12 @@ def PLUGIN_make_unique(input, keepordering=None):
printordering = False
misc.sprint('keepordering (default): %s'%keepordering) # AV - add a printout only in the first call
else:
misc.sprint('keepordering (argument): %s'%keepordering) # AV - add a printout at every call only if it is an argument
misc.sprint('keepordering (argument): %s'%keepordering) # AV - add a printout at every call only if it is an argument
###sprint(keepordering) # AV - remove the printout at every call
if not keepordering:
return list(set(input))
else:
return list(dict.fromkeys(input))
return list(dict.fromkeys(input))

DEFAULT_make_unique = misc.make_unique
misc.make_unique = PLUGIN_make_unique
Expand Down Expand Up @@ -65,12 +65,12 @@ class PLUGIN_ProcessExporter(export_cpp.ProcessExporterGPU):
# Note: only change class attribute
# - PLUGIN_ProcessExporter(ProcessExporterGPU)
# This class

# Below are the class variable that are defined in export_v4.VirtualExporter
# AV - keep defaults from export_v4.VirtualExporter
# Check status of the directory. Remove it if already exists
###check = True
# Output type: [Template/dir/None] copy the Template (via copy_template), just create dir or do nothing
###check = True
# Output type: [Template/dir/None] copy the Template (via copy_template), just create dir or do nothing
###output = 'Template'

# If sa_symmetry is true, generate fewer matrix elements
Expand All @@ -80,10 +80,10 @@ class PLUGIN_ProcessExporter(export_cpp.ProcessExporterGPU):
# Below are the class variable that are defined in export_cpp.ProcessExporterGPU
# AV - keep defaults from export_cpp.ProcessExporterGPU
# Decide which type of merging is used [madevent/madweight]
###grouped_mode = False
###grouped_mode = False
# Other options
###default_opt = {'clean': False, 'complex_mass':False, 'export_format':'madevent', 'mp': False, 'v5_model': True }

# AV - keep defaults from export_cpp.ProcessExporterGPU
# AV - used in MadGraphCmd.do_output to assign export_cpp.ExportCPPFactory to MadGraphCmd._curr_exporter (if cpp or gpu)
# AV - used in MadGraphCmd.export to assign helas_call_writers.(CPPUFO|GPUFO)HelasCallWriter to MadGraphCmd._curr_helas_model (if cpp or gpu)
Expand All @@ -93,16 +93,18 @@ class PLUGIN_ProcessExporter(export_cpp.ProcessExporterGPU):
# AV - use a custom OneProcessExporter
###oneprocessclass = export_cpp.OneProcessExporterGPU # responsible for P directory
oneprocessclass = model_handling.PLUGIN_OneProcessExporter

# Information to find the template file that we want to include from madgraph
# you can include additional file from the plugin directory as well
# AV - use template files from PLUGINDIR instead of MG5DIR and add gpu/mgOnGpuVectors.h
# [NB: mgOnGpuConfig.h, check_sa.cc and fcheck_sa.f are handled through dedicated methods]
###s = MG5DIR + '/madgraph/iolibs/template_files/'
s = PLUGINDIR + '/madgraph/iolibs/template_files/'
from_template = {'.': [s+'.clang-format'],
from_template = {'.': [s+'.clang-format', s+'CMakeLists.txt'],
'CMake': [s+'CMake/Compilers.txt', s+'CMake/Platforms.txt', s+'CMake/Macros.txt'],
'src': [s+'gpu/rambo.h', s+'read_slha.h', s+'read_slha.cc',
s+'gpu/mgOnGpuFptypes.h', s+'gpu/mgOnGpuCxtypes.h', s+'gpu/mgOnGpuVectors.h'],
s+'gpu/mgOnGpuFptypes.h', s+'gpu/mgOnGpuCxtypes.h', s+'gpu/mgOnGpuVectors.h',
s+'src/CMakeLists.txt'],
'SubProcesses': [s+'gpu/nvtx.h', s+'gpu/timer.h', s+'gpu/timermap.h', s+'gpu/CudaRuntime.h',
s+'gpu/MemoryBuffers.h', s+'gpu/MemoryAccessHelpers.h', s+'gpu/MemoryAccessVectors.h',
s+'gpu/MemoryAccessMatrixElements.h', s+'gpu/MemoryAccessMomenta.h',
Expand All @@ -120,11 +122,13 @@ class PLUGIN_ProcessExporter(export_cpp.ProcessExporterGPU):
s+'gpu/MadgraphTest.h', s+'gpu/runTest.cc',
s+'gpu/testmisc.cc', s+'gpu/testxxx_cc_ref.txt',
s+'gpu/perf.py', s+'gpu/profile.sh']}
s+'gpu/testmisc.cc', s+'gpu/testxxx_cc_ref.txt',
s+'gpu/perf.py', s+'gpu/profile.sh', s+'SubProcesses/CMakeLists.txt']}
to_link_in_P = ['nvtx.h', 'timer.h', 'timermap.h', 'CudaRuntime.h',
'MemoryBuffers.h', 'MemoryAccessHelpers.h', 'MemoryAccessVectors.h',
'MemoryAccessMatrixElements.h', 'MemoryAccessMomenta.h',
'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h',
'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h',
'MemoryAccessRandomNumbers.h', 'MemoryAccessWeights.h',
'MemoryAccessAmplitudes.h', 'MemoryAccessWavefunctions.h',
'EventStatistics.h',
'CrossSectionKernels.cc', 'CrossSectionKernels.h',
'MatrixElementKernels.cc', 'MatrixElementKernels.h',
Expand All @@ -146,9 +150,9 @@ class PLUGIN_ProcessExporter(export_cpp.ProcessExporterGPU):

# AV - use a custom UFOModelConverter (model/aloha exporter)
###create_model_class = export_cpp.UFOModelConverterGPU
import PLUGIN.CUDACPP_SA_OUTPUT.model_handling as model_handling
import PLUGIN.CUDACPP_SA_OUTPUT.model_handling as model_handling
create_model_class = model_handling.PLUGIN_UFOModelConverter

# AV - "aloha_exporter" is not used anywhere!
# (OM: "typically not defined but useful for this tutorial - the class for writing helas routine")
###aloha_exporter = None
Expand Down
2 changes: 2 additions & 0 deletions epochX/cudacpp/gg_tt/CMake/Compilers.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
10 changes: 10 additions & 0 deletions epochX/cudacpp/gg_tt/CMake/Macros.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
MACRO(SUBDIRLIST result)
FILE(GLOB children RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*)
SET(dirlist "")
FOREACH(child ${children})
IF(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${child})
LIST(APPEND dirlist ${child})
ENDIF()
ENDFOREACH()
SET(${result} ${dirlist})
ENDMACRO()
3 changes: 3 additions & 0 deletions epochX/cudacpp/gg_tt/CMake/Platforms.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
if (CMAKE_HOST_APPLE)
add_definitions(-DMGONGPU_HAS_NO_CURAND)
endif(CMAKE_HOST_APPLE)
14 changes: 14 additions & 0 deletions epochX/cudacpp/gg_tt/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# Minimal CMake configuration to build a functional CPU version

cmake_minimum_required(VERSION 3.22)

project(Madgraph4GPU)

include(${PROJECT_SOURCE_DIR}/CMake/Platforms.txt)
include(${PROJECT_SOURCE_DIR}/CMake/Compilers.txt)
include(${PROJECT_SOURCE_DIR}/CMake/Macros.txt)

set(PROJECT_GITROOT_DIR ${PROJECT_SOURCE_DIR}/../../..)

add_subdirectory(src)
add_subdirectory(SubProcesses)
18 changes: 15 additions & 3 deletions epochX/cudacpp/gg_tt/SubProcesses/Bridge.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,14 +98,16 @@ namespace mg5amcCpu
*/
void gpu_sequence( const FORTRANFPTYPE* momenta, FORTRANFPTYPE* mes, const bool goodHelOnly = false );

void cpu_depCouplings( const FORTRANFPTYPE* gs );

/**
* Sequence to be executed for the vectorized CPU matrix element calculation
*
* @param momenta the pointer to the input 4-momenta
* @param mes the pointer to the output matrix elements
* @param goodHelOnly quit after computing good helicities?
*/
void cpu_sequence( const FORTRANFPTYPE* momenta, FORTRANFPTYPE* mes, const bool goodHelOnly = false );
void cpu_sequence( const FORTRANFPTYPE* momenta, const FORTRANFPTYPE* gs, FORTRANFPTYPE* mes, const bool goodHelOnly = false );

private:
int m_nevt; // number of events
Expand All @@ -122,6 +124,7 @@ namespace mg5amcCpu
static constexpr int s_gputhreadsmin = 32; // minimum number of gpu threads
#else
mg5amcCpu::HostBufferMomenta m_hstMomentaC;
mg5amcCpu::HostBufferGs m_hstGsC;
mg5amcCpu::HostBufferMatrixElements m_hstMEsC;
std::unique_ptr<mg5amcCpu::MatrixElementKernelHost> m_pmek;
#endif
Expand Down Expand Up @@ -163,6 +166,7 @@ namespace mg5amcCpu
, m_hstMEsC( m_nevt )
#else
, m_hstMomentaC( m_nevt )
, m_hstGsC( m_nevt )
, m_hstMEsC( m_nevt )
#endif
, m_pmek( nullptr )
Expand All @@ -186,7 +190,7 @@ namespace mg5amcCpu
#else
std::cout << "WARNING! Instantiate host Bridge (nevt=" << m_nevt << ")" << std::endl;
mg5amcCpu::CPPProcess process( /*verbose=*/false );
m_pmek.reset( new mg5amcCpu::MatrixElementKernelHost( m_hstMomentaC, m_hstMEsC, m_nevt ) );
m_pmek.reset( new mg5amcCpu::MatrixElementKernelHost( m_hstMomentaC, m_hstGsC, m_hstMEsC, m_nevt ) );
#endif // __CUDACC__
process.initProc( "../../Cards/param_card.dat" );
}
Expand Down Expand Up @@ -235,8 +239,16 @@ namespace mg5amcCpu
#endif

#ifndef __CUDACC__

template<typename FORTRANFPTYPE>
void Bridge<FORTRANFPTYPE>::cpu_depCouplings( const FORTRANFPTYPE* gs )
{
memcpy( m_hstGsC.data(), gs, m_nevt * sizeof( FORTRANFPTYPE ) );
m_pmek->computeDependentCouplings();
}

template<typename FORTRANFPTYPE>
void Bridge<FORTRANFPTYPE>::cpu_sequence( const FORTRANFPTYPE* momenta, FORTRANFPTYPE* mes, const bool goodHelOnly )
void Bridge<FORTRANFPTYPE>::cpu_sequence( const FORTRANFPTYPE* momenta, const FORTRANFPTYPE* gs, FORTRANFPTYPE* mes, const bool goodHelOnly )
{
hst_transposeMomentaF2C( momenta, m_hstMomentaC.data(), m_nevt );
if( !m_goodHelsCalculated )
Expand Down
17 changes: 13 additions & 4 deletions epochX/cudacpp/gg_tt/SubProcesses/BridgeKernels.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,10 @@ namespace mg5amcCpu
//--------------------------------------------------------------------------

BridgeKernelBase::BridgeKernelBase( const BufferMomenta& momenta, // input: momenta
const BufferGs& gs, // input: gs for alphaS
BufferMatrixElements& matrixElements, // output: matrix elements
const size_t nevt )
: MatrixElementKernelBase( momenta, matrixElements )
: MatrixElementKernelBase( momenta, gs, matrixElements )
, NumberOfEvents( nevt )
, m_bridge( nevt, npar, np4 )
{
Expand All @@ -42,9 +43,10 @@ namespace mg5amcCpu
//--------------------------------------------------------------------------

BridgeKernelHost::BridgeKernelHost( const BufferMomenta& momenta, // input: momenta
const BufferGs& gs, // input: Gs for alphaS
BufferMatrixElements& matrixElements, // output: matrix elements
const size_t nevt )
: BridgeKernelBase( momenta, matrixElements, nevt )
: BridgeKernelBase( momenta, gs, matrixElements, nevt )
, m_fortranMomenta( nevt )
{
}
Expand All @@ -58,18 +60,25 @@ namespace mg5amcCpu

//--------------------------------------------------------------------------

void BridgeKernelHost::computeDependentCouplings()
{
m_bridge.cpu_depCouplings( m_gs.data() );
}

//--------------------------------------------------------------------------

void BridgeKernelHost::computeGoodHelicities()
{
constexpr bool goodHelOnly = true;
m_bridge.cpu_sequence( m_fortranMomenta.data(), m_matrixElements.data(), goodHelOnly );
m_bridge.cpu_sequence( m_fortranMomenta.data(), m_gs.data(), m_matrixElements.data(), goodHelOnly );
}

//--------------------------------------------------------------------------

void BridgeKernelHost::computeMatrixElements()
{
constexpr bool goodHelOnly = false;
m_bridge.cpu_sequence( m_fortranMomenta.data(), m_matrixElements.data(), goodHelOnly );
m_bridge.cpu_sequence( m_fortranMomenta.data(), m_gs.data(), m_matrixElements.data(), goodHelOnly );
}

//--------------------------------------------------------------------------
Expand Down
5 changes: 5 additions & 0 deletions epochX/cudacpp/gg_tt/SubProcesses/BridgeKernels.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ namespace mg5amcCpu

// Constructor from existing input and output buffers
BridgeKernelBase( const BufferMomenta& momenta, // input: momenta
const BufferGs& gs, // input: gs for alphaS
BufferMatrixElements& matrixElements, // output: matrix elements
const size_t nevt );

Expand All @@ -47,12 +48,16 @@ namespace mg5amcCpu

// Constructor from existing input and output buffers
BridgeKernelHost( const BufferMomenta& momenta, // input: momenta
const BufferGs& gs, // input: gs for alphaS
BufferMatrixElements& matrixElements, // output: matrix elements
const size_t nevt );

// Destructor
virtual ~BridgeKernelHost() {}

// Calculate dependent couplings from Gs transferred via the Bridge
void computeDependentCouplings() override final;

// Transpose input momenta from C to Fortran before the matrix element calculation in the Bridge
void transposeInputMomentaC2F() override final;

Expand Down
4 changes: 4 additions & 0 deletions epochX/cudacpp/gg_tt/SubProcesses/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
SUBDIRLIST(SUBDIRS)
FOREACH(subdir ${SUBDIRS})
ADD_SUBDIRECTORY(${subdir})
ENDFOREACH()
10 changes: 9 additions & 1 deletion epochX/cudacpp/gg_tt/SubProcesses/MatrixElementKernels.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,10 @@ namespace mg5amcCpu
//--------------------------------------------------------------------------

MatrixElementKernelHost::MatrixElementKernelHost( const BufferMomenta& momenta, // input: momenta
const BufferGs& gs, // input: gs for alphaS
BufferMatrixElements& matrixElements, // output: matrix elements
const size_t nevt )
: MatrixElementKernelBase( momenta, matrixElements )
: MatrixElementKernelBase( momenta, gs, matrixElements )
, NumberOfEvents( nevt )
{
if( m_momenta.isOnDevice() ) throw std::runtime_error( "MatrixElementKernelHost: momenta must be a host array" );
Expand All @@ -43,6 +44,13 @@ namespace mg5amcCpu

//--------------------------------------------------------------------------

void MatrixElementKernelHost::computeDependentCouplings()
{
dependentCouplings( m_gs.data(), m_gs.size() );
}

//--------------------------------------------------------------------------

void MatrixElementKernelHost::computeGoodHelicities()
{
using mgOnGpu::ncomb; // the number of helicity combinations
Expand Down
Loading