diff --git a/loopy/kernel/__init__.py b/loopy/kernel/__init__.py index 550288642a053888cf5125129471c8bed9736cfa..6be38e45c3f6d8502e03934c9c27ea8d89734536 100644 --- a/loopy/kernel/__init__.py +++ b/loopy/kernel/__init__.py @@ -142,6 +142,11 @@ class LoopKernel(ImmutableRecordWithoutPickling): A :class:`dict` mapping inames (as strings) to instances of :class:`loopy.kernel.data.IndexTag`. + .. attribute:: iname_to_pragma + + A :class:`dict` mapping inames (as strings) + to pragma (as #pragma 'value here'). + .. attribute:: function_manglers .. attribute:: symbol_manglers @@ -195,6 +200,7 @@ class LoopKernel(ImmutableRecordWithoutPickling): local_sizes={}, temporary_variables={}, iname_to_tag={}, + iname_to_pragma={}, substitutions={}, function_manglers=[ default_function_mangler, @@ -280,6 +286,7 @@ class LoopKernel(ImmutableRecordWithoutPickling): temporary_variables=temporary_variables, local_sizes=local_sizes, iname_to_tag=iname_to_tag, + iname_to_pragma=iname_to_pragma, substitutions=substitutions, cache_manager=cache_manager, applied_iname_rewrites=applied_iname_rewrites, @@ -1340,6 +1347,7 @@ class LoopKernel(ImmutableRecordWithoutPickling): "local_sizes", "temporary_variables", "iname_to_tag", + "iname_to_pragma", "substitutions", "iname_slab_increments", "loop_priority", diff --git a/loopy/target/c/__init__.py b/loopy/target/c/__init__.py index 8e69793e8079864a7e4c3117f267a20d6db3962f..03cb4522442674a4c17be792a81e32ce500e9caf 100644 --- a/loopy/target/c/__init__.py +++ b/loopy/target/c/__init__.py @@ -922,7 +922,7 @@ class CASTBuilder(ASTBuilderBase): from pymbolic.mapper.stringifier import PREC_NONE from cgen import For, InlineInitializer - return For( + loop = For( InlineInitializer( POD(self, iname_dtype, iname), ecm(lbound, PREC_NONE, "i")), @@ -935,6 +935,13 @@ class CASTBuilder(ASTBuilderBase): "++%s" % iname, inner) + if iname in codegen_state.kernel.iname_to_pragma: + from cgen import Block, Pragma + pragma = Pragma(codegen_state.kernel.iname_to_pragma[iname]) + loop = Block([pragma, loop]) + + return loop + def emit_initializer(self, codegen_state, dtype, name, val_str, is_const): decl = POD(self, dtype, name)