Showing results for 
Search instead for 
Did you mean: 

C standard headers and macros


I am having some trouble with C standard headers and macros in my kernels. I am trying to use some intrincate macros that work fine when they are resolved by the gcc preprocessor. However, aoc is unable to deal with them. It can not find <string.h>, for example (the files that contain these macro include this header, among others), so I have to force the inclusion of /usr/include with -I. As this is a standard header, I do not see why it should not be found straightforwardly. After that it will not found other headers, and will keep asking for more headers as soon as I provide the path to the compiler (aoc). All of them are standard and are found by gcc. The amount of errors apart from the inclusion of headers grows each time I include a new one and they refer to macro expansion.


Could someone give me a clue about what is happening? Are macros not supported by aoc preprocessor? What is going on with the inclusion of headers?

0 Kudos
2 Replies
Valued Contributor II

"aoc" is an OpenCL compiler, not a C compiler, and OpenCL only supports a subset of C at kernel level. Macros are certainly supported by aoc, but I am not sure what you are trying to do that requires including of C standard headers. Maybe if you post a simplified example kernel that shows the issue, we would be able to find a solution/work-around. At the same time, you can try compiling your kernel against NVIDIA or AMD's OpenCL SDK; if it still didn't work, then you know what you are trying to do is not supported in OpenCL.


Since the problem stems from the files that contain the macros including standard C headers I am trying to reproduce the scenario with this minimal kernel:


#include <string.h>


__kernel void prueba() {

int a = 1;



Since aoc cannot find string.h I compile this kernel with:

aoc -I /usr/include -march=emulator


Then aoc outputs it cannot find stdef.h, so I include a new directory:

aoc -I /usr/include -I /usr/include/linux -march=emulator


Then 21 errors are generated. Among them:

In file included from /usr/include/string.h:633:

/usr/include/bits/string2.h:972:3: error: OpenCL does not support the 'register' storage class specifier

 register size_t __result = 0;


/usr/include/bits/string2.h:1128:25: error: use of undeclared identifier 'NULL'

 return *__s == '\0' ? NULL : (char *) (size_t) __s;


Any idea of what is going on here?



It seems OpenCL 1.0 will not allow including string.h, among other C99 headers ( Does this apply to the OpenCL version leveraged by Intel FPGA SDK for OpenCL?



According to (A.1.2 p.193) Intel FPGA SDK for OpenCL has this restriction.