Skip to content

Commit

Permalink
- Compact free_memory. Check parallel variable type in Template. Gene…
Browse files Browse the repository at this point in the history
…rate one more file for ParModelica.

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@11636 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
mahge committed Apr 2, 2012
1 parent 4263885 commit 3711751
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 9 deletions.
28 changes: 23 additions & 5 deletions Compiler/susan_codegen/SimCode/CodegenC.tpl
Expand Up @@ -77,6 +77,10 @@ case SIMCODE(modelInfo=modelInfo as MODELINFO(__)) then
// for the same model (i.e. see testsuite/linearize/simextfunction.mos).
let()= textFile(simulationFile(simCode,guid), '<%fileNamePrefix%>.c')

// If ParModelica generate the kernels file too.
if acceptParModelicaGrammar() then
let()= textFile(parModelicaKernelsFile(fileNamePrefix, modelInfo.functions, literals), '<%fileNamePrefix%>_kernels.cl')

//this top-level template always returns an empty result
//since generated texts are written to files directly
""
Expand Down Expand Up @@ -2053,6 +2057,20 @@ template simulationFunctionsFile(String filePrefix, list<Function> functions, li
/* adpro: leave a newline at the end of file to get rid of warnings! */
end simulationFunctionsFile;

template parModelicaKernelsFile(String filePrefix, list<Function> functions, list<Exp> literals)
"Generates the content of the C file for functions in the simulation case."
::=
<<
#include "<%filePrefix%>_functions.h"

<%literals |> literal hasindex i0 fromindex 0 => literalExpConst(literal,i0) ; separator="\n"%>
<%functionBodies(functions)%>


>>

end parModelicaKernelsFile;

template recordsFile(String filePrefix, list<RecordDeclaration> recordDecls)
"Generates the content of the C file for functions in the simulation case."
::=
Expand Down Expand Up @@ -3408,7 +3426,7 @@ template parVarInit(Variable var, String outStruct, Integer i, Text &varDecls /*
Does not return anything: just appends declarations to buffers."
::=
match var
case var as VARIABLE(__) then
case var as VARIABLE(parallelism = PARGLOBAL(__)) then
let varName = '<%contextCref(var.name,contextFunction)%>'


Expand All @@ -3422,16 +3440,16 @@ case var as VARIABLE(__) then
let defaultValue = varDefaultValue(var, outStruct, i, varName, &varDecls, &varInits)
let &varInits += defaultValue

let &varFrees += 'clReleaseMemObject(<%varName%>.data);<%\n%>'
let &varFrees += 'clReleaseMemObject(<%varName%>.info_dev);<%\n%>'
let &varFrees += 'free(<%varName%>.info);<%\n%>'
let &varFrees += 'free_device_array(&<%varName%>);<%\n%>'
""
else
let &varDecls += 'device_<%expTypeShort(var.ty)%> <%varName%>;<%\n%>'
let &varInits += '<%varName%> = ocl_device_alloc(sizeof(modelica_<%expTypeShort(var.ty)%>));<%\n%>'
let &varFrees += 'clReleaseMemObject(<%varName%>);<%\n%>'
""

case var as VARIABLE(parallelism = PARLOCAL(__)) then
let &varDecls += '#PARLOCAL variable type should not be allowed here. FIXME!!<%\n%>' ""

else let &varDecls += '#error Unknown parallel variable type<%\n%>' ""
end parVarInit;

Expand Down
8 changes: 6 additions & 2 deletions ParModelica/OpenCLRuntime/omc_ocl_interface.c
Expand Up @@ -136,7 +136,7 @@ void alloc_integer_array(device_integer_array *dest, int ndims, ...){
}

//entry point for allocating real array on device
void alloc_real_array(device_integer_array *dest, int ndims, ...){
void alloc_real_array(device_real_array *dest, int ndims, ...){

size_t elements = 0;
va_list ap;
Expand All @@ -150,7 +150,11 @@ void alloc_real_array(device_integer_array *dest, int ndims, ...){
}



void free_device_array(device_array *dest){
clReleaseMemObject(dest->data);
clReleaseMemObject(dest->info_dev);
free(dest->info);
}


void copy_real_array_data(device_real_array* dev_array_ptr, real_array_t* host_array_ptr){
Expand Down
3 changes: 3 additions & 0 deletions ParModelica/OpenCLRuntime/omc_ocl_interface.h
Expand Up @@ -134,6 +134,9 @@ modelica_integer size_of_dimension_real_array(device_real_array dev_arr, modelic
//array dimension size functions. returns the size of a given dimension for device integer array
modelica_integer size_of_dimension_integer_array(device_integer_array dev_arr, modelica_integer dim);

//Free a device array memory.
void free_device_array(device_array *dest);


//prints information about a device array. useful for debugging.
void print_array_info(device_real_array* arr);
Expand Down
17 changes: 15 additions & 2 deletions ParModelica/OpenCLRuntime/omc_ocl_memory_ops.c
Expand Up @@ -51,7 +51,11 @@
cl_mem ocl_device_alloc(size_t size){

cl_int err;
cl_mem tmp;
cl_mem tmp = NULL;

if (!device_comm_queue)
ocl_initialize();

tmp = clCreateBuffer(device_context, CL_MEM_READ_WRITE,
size, NULL, &err);

Expand All @@ -63,6 +67,10 @@ cl_mem ocl_device_alloc_init(modelica_integer* host_array, size_t size){

cl_int err;
cl_mem tmp = NULL;

if (!device_comm_queue)
ocl_initialize();

if (host_array)
tmp = clCreateBuffer(device_context, CL_MEM_READ_WRITE |
CL_MEM_COPY_HOST_PTR, size, host_array, &err);
Expand All @@ -77,6 +85,10 @@ cl_mem ocl_device_alloc_init(modelica_real* host_array, size_t size){

cl_int err;
cl_mem tmp = NULL;

if (!device_comm_queue)
ocl_initialize();

if (host_array)
tmp = clCreateBuffer(device_context, CL_MEM_READ_WRITE |
CL_MEM_COPY_HOST_PTR, size, host_array, &err);
Expand All @@ -90,7 +102,8 @@ cl_mem ocl_device_alloc_init(modelica_real* host_array, size_t size){

cl_mem ocl_alloc_init(void* src_data, size_t size){
cl_int err;
cl_mem tmp;
cl_mem tmp = NULL;

if (!device_comm_queue)
ocl_initialize();

Expand Down

0 comments on commit 3711751

Please sign in to comment.