aboutsummaryrefslogtreecommitdiff
path: root/Tools/CodeGen/CaKernel.m
diff options
context:
space:
mode:
authorIan Hinder <ian.hinder@aei.mpg.de>2012-04-23 21:49:42 +0200
committerIan Hinder <ian.hinder@aei.mpg.de>2012-04-23 21:49:42 +0200
commit86bafb7588ec88ab829c9daf2850fceee138b23c (patch)
tree91d6f727bdf4912bfe3765779114d4e73978025f /Tools/CodeGen/CaKernel.m
parent68d93477c5dd0fb61b127e1c758630daf9c5227a (diff)
CaKernel.m: Wrap host/device routines in a schedule group
Diffstat (limited to 'Tools/CodeGen/CaKernel.m')
-rw-r--r--Tools/CodeGen/CaKernel.m39
1 files changed, 30 insertions, 9 deletions
diff --git a/Tools/CodeGen/CaKernel.m b/Tools/CodeGen/CaKernel.m
index 870989e..ba5bca2 100644
--- a/Tools/CodeGen/CaKernel.m
+++ b/Tools/CodeGen/CaKernel.m
@@ -202,16 +202,37 @@ DefFn[
If[lookup[calc,ExecuteOn,Automatic] === Host,
{calc},
- {mapReplaceAdd[
+
+ Module[
+ {deviceCalc, hostCalc, newCalcs},
+
+ deviceCalc =
+ mapReplaceAdd[
+ mapReplaceAdd[
+ mapReplace[
+ calc,
+ Name,"DEVICE_"<>lookup[calc,Name]],
+ UseCaKernel, True],
+ ExecuteOn, Device];
+
+ hostCalc =
mapReplaceAdd[
- AddConditionSuffix[calc, "Accelerator::device_process"],
- UseCaKernel, True],
- ExecuteOn, Device],
- mapReplaceAdd[
- mapReplaceAdd[
- AddConditionSuffix[mapReplace[calc,Name,"HOST__"<>lookup[calc,Name]], "Accelerator::host_process"],
- UseCaKernel,False],
- ExecuteOn, Host]}]];
+ mapReplaceAdd[
+ mapReplace[
+ calc,
+ Name,"HOST_"<>lookup[calc,Name]],
+ UseCaKernel,False],
+ ExecuteOn, Host];
+
+ newCalcs = Map[InNewScheduleGroup[lookup[calc,Name],#] &, {hostCalc, deviceCalc}];
+
+ (* Apply the conditional to the routines, not to the group *)
+ newCalcs = MapThread[AddConditionSuffix,
+ {newCalcs,
+ {"Accelerator::host_process",
+ "Accelerator::device_process"}}];
+
+ newCalcs]]];
DefFn[
WithHostCalculations[calcs_List] :=