Skip to content

Commit

Permalink
ParModelica: Check declaration of global vars in kernel functions. An…
Browse files Browse the repository at this point in the history
…d add omc prefix to parallel/kernel functions.

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@13957 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
mahge committed Nov 19, 2012
1 parent e8c210e commit 0606b02
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 6 deletions.
41 changes: 40 additions & 1 deletion Compiler/FrontEnd/Inst.mo
Original file line number Diff line number Diff line change
Expand Up @@ -6787,7 +6787,9 @@ algorithm
// print(" instElement: A component: " +& name +& "\n");
//print("instElement: " +& name +& " in s:" +& Env.printEnvPathStr(env) +& " m: " +& SCodeDump.printModStr(m) +& " cm: " +& Mod.printModStr(cmod) +& " mods:" +& Mod.printModStr(mods) +& "\n");
//print("Env:\n" +& Env.printEnvStr(env) +& "\n");


true = Util.if_(Config.acceptParModelicaGrammar(), checkParallelismWRTEnv(env,name,attr,info), true);

m = traverseModAddFinal(m, final_prefix);
comp = SCode.COMPONENT(name, prefixes, attr, ts, m, comment, cond, info);

Expand Down Expand Up @@ -18188,4 +18190,41 @@ algorithm
end matchcontinue;
end addRecordConstructorFunction;


protected function checkParallelismWRTEnv
input Env.Env inEnv;
input String inName;
input SCode.Attributes inAttr;
input Absyn.Info inInfo;
output Boolean isValid;
algorithm
_ := matchcontinue(inEnv,inName,inAttr,inInfo)
local
String errorString,scopeName;
Env.ScopeType stype;
Absyn.Direction dir;
SCode.Parallelism prl;
Boolean isparglobal;
Boolean hasnodir;

case(Env.FRAME(optName = SOME(scopeName), optType = SOME(Env.PARALLEL_SCOPE()))::_, _, SCode.ATTR(parallelism = prl, direction = dir), _)
equation
isparglobal = SCode.parallelismEqual(prl, SCode.PARGLOBAL());
hasnodir = not Absyn.isInputOrOutput(dir);
true = isparglobal and hasnodir;

errorString = "\n" +&
"- local parglobal component '" +& inName +&
"' is declared in parallel/parkernel function '" +& scopeName +& "'. \n" +&
"- parglobal variables can be declared only in normal functions. \n";

Error.addSourceMessage(Error.PARMODELICA_ERROR,
{errorString}, inInfo);
then false;

case(_,_,_,_) then true;

end matchcontinue;
end checkParallelismWRTEnv;

end Inst;
10 changes: 5 additions & 5 deletions Compiler/Template/CodegenC.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -3242,7 +3242,7 @@ template functionHeaderKernelFunctionInterface(String fname, list<Variable> farg
%>
} <%fname%>_rettype;

<%fname%>_rettype _<%fname%>(<%fargsStr%>);
<%fname%>_rettype omc_<%fname%>(<%fargsStr%>);
>> else <<

void _<%fname%>(<%fargsStr%>);
Expand Down Expand Up @@ -3737,7 +3737,7 @@ case KERNEL_FUNCTION(__) then

<<

__kernel void _<%fname%>(
__kernel void omc_<%fname%>(
<%\t%><%\t%><%argStr%>
) {
Expand Down Expand Up @@ -3796,7 +3796,7 @@ case PARALLEL_FUNCTION(__) then


<<
<%retType%> _<%fname%>(<%functionArguments |> var => funArgDefinition(var) ;separator=", "%>)
<%retType%> omc_<%fname%>(<%functionArguments |> var => funArgDefinition(var) ;separator=", "%>)
{
<%funArgs%>
<%varDecls%>
Expand Down Expand Up @@ -3881,7 +3881,7 @@ case KERNEL_FUNCTION(__) then
<<

/* Interface function to <%fname%> defined in parallelFunctions.cl file. */
<%retType%> _<%fname%>(<%functionArguments |> var => funArgDefinitionKernelFunctionInterface(var) ;separator=", "%>)
<%retType%> omc_<%fname%>(<%functionArguments |> var => funArgDefinitionKernelFunctionInterface(var) ;separator=", "%>)
{
<%funArgs%>
<%varDecls%>
Expand All @@ -3893,7 +3893,7 @@ case KERNEL_FUNCTION(__) then
/* functionBodyKernelFunctionInterface : <%fname%> Kernel creation and execution */
int <%kernel_arg_number%> = 0;
<%cl_kernelVar%> = ocl_create_kernel(omc_ocl_program, "_<%fname%>");
<%cl_kernelVar%> = ocl_create_kernel(omc_ocl_program, "omc_<%fname%>");
<%kernelArgSets%>
ocl_execute_kernel(<%cl_kernelVar%>);
clReleaseKernel(<%cl_kernelVar%>);
Expand Down

0 comments on commit 0606b02

Please sign in to comment.