- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello:
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?
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
"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.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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 min_example.cl
Then aoc outputs it cannot find stdef.h, so I include a new directory:
aoc -I /usr/include -I /usr/include/linux -march=emulator min_example.cl
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?
Edit:
It seems OpenCL 1.0 will not allow including string.h, among other C99 headers (https://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/restrictions.html). Does this apply to the OpenCL version leveraged by Intel FPGA SDK for OpenCL?
Edit2:
According to https://www.intel.com/content/dam/www/programmable/us/en/pdfs/literature/hb/opencl-sdk/aocl_programming_guide.pdf (A.1.2 p.193) Intel FPGA SDK for OpenCL has this restriction.
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page