Skip to content
Snippets Groups Projects

Reduction Support

Open Richard Angersbach requested to merge rangersbach/reductions into v2.0-dev
Viewing commit 777ab888
Show latest version
1 file
+ 20
6
Preferences
Compare changes
@@ -4,6 +4,7 @@ from typing import Sequence
@@ -4,6 +4,7 @@ from typing import Sequence
from pystencils.backend.ast.expressions import PsCall
from pystencils.backend.ast.expressions import PsCall
from ..functions import CFunction, PsMathFunction, MathFunctions, NumericLimitsFunctions
from ..functions import CFunction, PsMathFunction, MathFunctions, NumericLimitsFunctions
 
from ..literals import PsLiteral
from ...types import PsIntegerType, PsIeeeFloatType, PsScalarType
from ...types import PsIntegerType, PsIeeeFloatType, PsScalarType
from .platform import Platform
from .platform import Platform
@@ -25,7 +26,7 @@ from ..ast.expressions import (
@@ -25,7 +26,7 @@ from ..ast.expressions import (
PsLookup,
PsLookup,
PsGe,
PsGe,
PsLe,
PsLe,
PsTernary,
PsTernary, PsLiteralExpr,
)
)
from ..ast.vector import PsVecMemAcc
from ..ast.vector import PsVecMemAcc
from ...types import PsVectorType, PsCustomType
from ...types import PsVectorType, PsCustomType
@@ -43,7 +44,7 @@ class GenericCpu(Platform):
@@ -43,7 +44,7 @@ class GenericCpu(Platform):
@property
@property
def required_headers(self) -> set[str]:
def required_headers(self) -> set[str]:
return {"<math.h>", "<limits.h>"}
return {"<math.h>", "<limits.h>", "<float.h>"}
def materialize_iteration_space(
def materialize_iteration_space(
self, body: PsBlock, ispace: IterationSpace
self, body: PsBlock, ispace: IterationSpace
@@ -63,12 +64,25 @@ class GenericCpu(Platform):
@@ -63,12 +64,25 @@ class GenericCpu(Platform):
arg_types = (dtype,) * func.num_args
arg_types = (dtype,) * func.num_args
if isinstance(dtype, PsScalarType) and func in (NumericLimitsFunctions.Min, NumericLimitsFunctions.Max):
if isinstance(dtype, PsScalarType) and func in (NumericLimitsFunctions.Min, NumericLimitsFunctions.Max):
cfunc: CFunction
# get type prefix for macro
cfunc = CFunction(f"{dtype.c_string()}_{func.function_name}".capitalize(), arg_types, dtype)
# TODO: there must be a better way...
call.function = cfunc
tpe = ""
return call
match dtype:
 
case PsIeeeFloatType():
 
match dtype.width:
 
case 32:
 
tpe = "FLT"
 
case 64:
 
tpe = "DBL"
 
case _:
 
raise MaterializationError(
 
f"No implementation available for function {func} on data type {dtype}"
 
)
 
 
return PsLiteralExpr(PsLiteral(f"{tpe}_{func.function_name}".upper(), dtype))
if isinstance(dtype, PsIeeeFloatType) and dtype.width in (32, 64):
if isinstance(dtype, PsIeeeFloatType) and dtype.width in (32, 64):
 
cfunc: CFunction
match func:
match func:
case (
case (
MathFunctions.Exp
MathFunctions.Exp