Application Acceleration With FPGAs
Programmable Acceleration Cards (PACs), DCP, DLA, Software Stack, and Reference Designs
Intel Support hours are Monday-Fridays, 8am-5pm PST, except Holidays. Thanks to our community members who provide support during our down time or before we get to your questions. We appreciate you!

Need Forum Guidance? Click here
Search our FPGA Knowledge Articles here.

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.