# Calling Standard C Code From OpenCL C Code¶

This OpenCL implementation supports the ability to call standard C code from OpenCL C code. This includes calling functions in existing C66 DSP libraries, such as the dsplib, mathlib or imglib. For examples of this capability please refer to the ccode example for calling a C function you define, or the dsplib_fft example for calling a function in a library.

The standard C code may also contain OpenMP pragmas to control parallel execution. Refer to Calling Standard C code with OpenMP from OpenCL C code for a description of this use case.

## Global variables in C code¶

This section describes the behavior of global variables in C code called from OpenCL C kernels. Global variables are variables declared at the file scope.

• Global variables must be annotated far or the C code must be compiled with the --mem_model:data=far --mem_model:const=data options. For details, refer the C6000 Compiler User’s Guide, section 7.5.5.1.

int far global_var = 0;

• Without any DATA_SECTION pragmas, global variables in C code are placed in external memory (DDR) that is shared across the compute units (C66x DSPs)in an OpenCL device.

• To give each compute unit its own copy of a global variable, there are two options:

• Use an array and index using the core id register, DNUM.

#include <c6x.h> // for DNUM
int far global_var[MAX_COMPUTE_UNITS]; // 2 for AM572, 8 for K2H
...

void foo()
{
... = global_var[DNUM];
}

• Place the global variable in memory local to the compute unit using the DATA_SECTION pragma. However, any explicit initialization of such variables is ignored and implicit zero initialization required by the C standard is not performed.

#pragma DATA_SECTION(global_var, ".mem_l2")
int global_var;   // Initialization has no effect