bench_translations.py 3.65 KiB
import numpy as np
from pyopencl.tools import ( # noqa
pytest_generate_tests_for_pyopencl as pytest_generate_tests)
from sumpy.expansion.multipole import (
VolumeTaylorMultipoleExpansion, H2DMultipoleExpansion,
LinearPDEConformingVolumeTaylorMultipoleExpansion)
from sumpy.expansion.local import (
VolumeTaylorLocalExpansion, H2DLocalExpansion,
LinearPDEConformingVolumeTaylorLocalExpansion)
from sumpy.kernel import LaplaceKernel, HelmholtzKernel
import logging
logger = logging.getLogger(__name__)
import pymbolic.mapper.flop_counter
import sumpy.symbolic as sym
from sumpy.assignment_collection import SymbolicAssignmentCollection
from sumpy.codegen import to_loopy_insns
class Param:
def __init__(self, dim, order):
self.dim = dim
self.order = order
def __repr__(self):
return f"{self.dim}D_order_{self.order}"
class TranslationBenchmarkSuite:
params = [
Param(2, 10),
Param(2, 15),
Param(2, 20),
Param(3, 5),
Param(3, 10),
]
param_names = ["order"]
def setup(self, param):
logging.basicConfig(level=logging.INFO)
np.random.seed(17)
if self.__class__ == TranslationBenchmarkSuite:
raise NotImplementedError
mpole_expn_class = self.mpole_expn_class
if param.order == 3 and H2DMultipoleExpansion == mpole_expn_class:
raise NotImplementedError
def track_m2l_op_count(self, param):
knl = self.knl(param.dim)
m_expn = self.mpole_expn_class(knl, order=param.order)
l_expn = self.local_expn_class(knl, order=param.order)
src_coeff_exprs = [sym.Symbol("src_coeff%d" % i)
for i in range(len(m_expn))]
dvec = sym.make_sym_vector("d", knl.dim)
src_rscale = sym.Symbol("src_rscale")
tgt_rscale = sym.Symbol("tgt_rscale")
result = l_expn.translate_from(m_expn, src_coeff_exprs, src_rscale,
dvec, tgt_rscale)
sac = SymbolicAssignmentCollection()
for i, expr in enumerate(result):
sac.assign_unique("coeff%d" % i, expr)
sac.run_global_cse()
insns = to_loopy_insns(sac.assignments.items())
counter = pymbolic.mapper.flop_counter.CSEAwareFlopCounter()
return sum([counter.rec(insn.expression)+1 for insn in insns])
track_m2l_op_count.unit = "ops"
track_m2l_op_count.timeout = 200.0
class LaplaceVolumeTaylorTranslation(TranslationBenchmarkSuite):
knl = LaplaceKernel
local_expn_class = VolumeTaylorLocalExpansion
mpole_expn_class = VolumeTaylorMultipoleExpansion
params = [
Param(2, 10),
Param(3, 5),
]
class LaplaceConformingVolumeTaylorTranslation(TranslationBenchmarkSuite):
knl = LaplaceKernel
local_expn_class = LinearPDEConformingVolumeTaylorLocalExpansion
mpole_expn_class = LinearPDEConformingVolumeTaylorMultipoleExpansion
class HelmholtzVolumeTaylorTranslation(TranslationBenchmarkSuite):
knl = HelmholtzKernel
local_expn_class = VolumeTaylorLocalExpansion
mpole_expn_class = VolumeTaylorMultipoleExpansion
params = [
Param(2, 10),
Param(3, 5),
]
class HelmholtzConformingVolumeTaylorTranslation(TranslationBenchmarkSuite):
knl = HelmholtzKernel
local_expn_class = LinearPDEConformingVolumeTaylorLocalExpansion
mpole_expn_class = LinearPDEConformingVolumeTaylorMultipoleExpansion
class Helmholtz2DTranslation(TranslationBenchmarkSuite):
knl = HelmholtzKernel
local_expn_class = H2DLocalExpansion
mpole_expn_class = H2DMultipoleExpansion
params = [
Param(2, 10),
Param(2, 15),
Param(2, 20),
]