Intel® Quartus® Prime Software
Intel® Quartus® Prime Design Software, Design Entry, Synthesis, Simulation, Verification, Timing Analysis, System Design (Platform Designer, formerly Qsys)
Announcements
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.

OpenCL C++ API

Altera_Forum
Honored Contributor II
3,503 Views

We are attempting to port our existing OpenCL application from Windows/Linux/Macintosh to the Cyclone 5 FPGA Development Board. We are using the ARM based cross compiler to compile our source code.  

 

Our source code uses the OpenCL C++ API. I am getting compilation errors that I need to resolve. This is what I have tried so far: 

 

// filename, "main.cpp"# if defined(OPENCL_CPP_API)# include <CL/cl.hpp># else# include <CL/cl.h># endif int main(void) { return 0; }  

 

When I issue the following command (i.e., main.cpp uses the OpenCL C API) at the command line, it successfully compiles and produces an object file. 

 

--- Quote Start ---  

 

arm-linux-gnueabihf-g++ -IC:/altera/14.0/hld/host/include -c main.cpp 

 

--- Quote End ---  

 

 

However, when I issue the following command (i.e., main.cpp uses the OpenCL C++ API) at the command line, the compilation fails. 

 

--- Quote Start ---  

 

arm-linux-gnueabihf-g++ -IC:/altera/14.0/hld/host/include -c main.cpp -DOPENCL_CPP_API 

In file included from main.cpp:2:0: 

C:/altera/14.0/hld/host/include/CL/cl.hpp:160:19: fatal error: GL/gl.h: No such file or directory 

compilation terminated. 

 

--- Quote End ---  

 

 

Is there a compiler flags that I need to include? Or do I need to install another library? OpenGL perhaps? When we took the Altera training class for OpenCL optimization, the instructor assured me that the OpenCL C++ API is supported for the SoC platform. 

 

Any help would be appreciated.
0 Kudos
5 Replies
Altera_Forum
Honored Contributor II
2,129 Views

I found the following "gl.h" files installed on my computer. 

 

C:\altera\14.0\quartus\bin64\cygwin\usr\include\w32api\GL\gl.h 

C:\altera\14.0\modelsim_ase\gcc-4.2.1-mingw32vc9\include\GL\gl.h 

C:\altera\14.0\embedded\host_tools\cygwin\usr\include\w32api\GL\gl.h 

C:\altera\14.0\embedded\host_tools\cygwin\usr\x86_64-w64-mingw32\sys-root\mingw\include\GL\gl.h 

 

Do I include any of these directories when compiling? And if so, which one? I am using the following compiler: 

 

 

--- Quote Start ---  

 

C:\>arm-linux-gnueabihf-g++ --version 

 

arm-linux-gnueabihf-g++.exe (crosstool-NG linaro-1.13.1-4.7-2013.03-20130313 - Linaro GCC 2013.03) 4.7.3 20130226 (prerelease) 

Copyright (C) 2012 Free Software Foundation, Inc. 

This is free software; see the source for copying conditions. There is NO 

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

 

--- Quote End ---  

0 Kudos
Altera_Forum
Honored Contributor II
2,129 Views

I got a lot further in the process. I still have some outstanding questions I need answered but I figured I will document where I am at right now for someone else having my same problems. 

 

Here is some sample code that I am compiling. 

# include <string> # include <iostream> # include <sstream> # include <CL/cl.hpp> template<typename QueryType, typename ValueType> void Log(QueryType& a_openclObject, cl_int a_propertyId, const std::string& a_propertyName, ValueType& a_value) { a_openclObject.getInfo(a_propertyId, &a_value); std::stringstream os; std::string spaces(40 - a_propertyName.size(), ' '); os << a_propertyName << ":" << spaces << a_value << std::endl; std::cout << os.str(); } # define LOG(openclObject, openclProperty, value) Log(openclObject, openclProperty,# openclProperty, value); int main(void) { // Find all the platforms on this computer... std::vector<cl::Platform> platforms; cl::Platform::get(&platforms); for (size_t i=0; i<platforms.size(); ++i) { std::string valueString; int valueInt; unsigned int valueUint; long long valueLongLong; LOG(platforms, CL_PLATFORM_VENDOR, valueString); // Now find out all the OpenCL devices supported for this platform... std::vector<cl::Device> devices; platforms.getDevices(CL_DEVICE_TYPE_ALL,&devices); for (size_t j=0; j<devices.size(); ++j) { // Dump out the specific information for this device... LOG(devices, CL_DEVICE_VERSION, valueString); LOG(devices, CL_DRIVER_VERSION, valueString); LOG(devices, CL_DEVICE_OPENCL_C_VERSION, valueString); LOG(devices, CL_DEVICE_MAX_COMPUTE_UNITS, valueInt); LOG(devices, CL_DEVICE_GLOBAL_MEM_SIZE, valueLongLong); LOG(devices, CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE, valueLongLong); LOG(devices, CL_DEVICE_LOCAL_MEM_SIZE, valueLongLong); LOG(devices, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, valueLongLong); LOG(devices, CL_DEVICE_MAX_CONSTANT_ARGS, valueLongLong); LOG(devices, CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR, valueUint); LOG(devices, CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR, valueUint); LOG(devices, CL_DEVICE_ENDIAN_LITTLE, valueUint); } } return 0; }  

 

 

Here is the makefile that I used. 

 

all: main.exe main.exe: main.o arm-linux-gnueabihf-g++ -LC:\altera\14.0\hld\board\c5soc\arm32\lib -LC:/altera/14.0/hld/host/arm32/lib -lalteracl -lalterahalmmd -lalterammdpcie -lelf -lrt -lstdc++ -o main.exe main.o main.o: main.cpp arm-linux-gnueabihf-g++ -IC:/altera/14.0/hld/host/include -IC:\altera\14.0\quartus\bin64\cygwin\usr\include\w32api -c main.cpp clean: rm main.o main.exe  

 

I was able to get passed the compilation error by including this line in the compilation step. 

 

--- Quote Start ---  

-IC:\altera\14.0\quartus\bin64\cygwin\usr\include\w32api 

--- Quote End ---  

 

 

Next step was to download the executable to the development board. However, when I ran the executable, I got this error. 

 

--- Quote Start ---  

./main.exe: error while loading shared libraries: libalteracl.so: cannot open shared object file: No such file or directory 

--- Quote End ---  

 

 

Oops! I ran the initialization script again. 

 

--- Quote Start ---  

root@socfpga:~# source ./init_opencl.sh 

Error: could not insert module /home/root/opencl_arm32_rte/board/c5soc/driver/aclsoc_drv.ko: File exists 

--- Quote End ---  

 

 

It seems to fail BUT now my executable runs! Yeah! 

 

--- Quote Start ---  

root@socfpga:~# ./main.exe 

CL_PLATFORM_VENDOR: Altera Corporation 

CL_DEVICE_VERSION: OpenCL 1.0 Altera SDK for OpenCL, Version 14.0 

CL_DRIVER_VERSION: 14.0 

CL_DEVICE_OPENCL_C_VERSION: OpenCL C 1.0 

CL_DEVICE_MAX_COMPUTE_UNITS: 1 

CL_DEVICE_GLOBAL_MEM_SIZE: 1073741824 

CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE: 0 

CL_DEVICE_LOCAL_MEM_SIZE: 16384 

CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 268435456 

CL_DEVICE_MAX_CONSTANT_ARGS: 8 

CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR: 4 

CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR: 4 

CL_DEVICE_ENDIAN_LITTLE: 1 

--- Quote End ---  

 

 

So my question before is still outstanding. What directory do I include in my compilation step so it pulls in the correct "gl.h" file? 

 

Also, I could not find any of this information in the documentation. I apologize if it is there but I couldn't find it. If it isn't there, you may want to include it for other developers in the future.
0 Kudos
Altera_Forum
Honored Contributor II
2,129 Views

dan.j.williams, the Linux distribution that is on the SoC board does not have OpenGL installed. Also, the ARM cross-compiler tool chain that we ship does not have OpenGL support. That's why gl.h is not found. Of course, you probably don't care about OpenGL at all, only C++ OpenCL interface. 

 

The best thing I can think of is to modify cl.hpp to not include gl.h (cl.hpp is created by the Khronos group and we do not modify it). Give it a quick try. I will try to do the same to see if I can get you through quickly. 

 

We did use cl.hpp on non-SoC platform and it works. So that's the only issue you should see with the C++ interface.
0 Kudos
Altera_Forum
Honored Contributor II
2,129 Views

OK, I fixed cl.hpp file to not include gl.h. We do not support OpenCL-OpenGL interoperability anyway, so there is no need to include that. Overwrite C:/altera/14.0/hld/host/include/CL/cl.hpp with attached cl.hpp.txt (make sure it's still called cl.hpp, I couldn't attach a file with .hpp extension). 

 

I tested a simple program that includes cl.hpp and it failed as you described before the change and compiles with the change.  

 

You can also use a random gl.hpp that you found, as long as you don't actually use any of the GL-related functions.  

 

We'll fix this in the new release of the tool. Thanks a lot for letting us know!
0 Kudos
Altera_Forum
Honored Contributor II
2,129 Views

dsk, 

I followed your instructions of replacing the installed "cl.hpp" file with the one you posted here. I was able to compile, link, and run the sample code I have in this post successfully on the FPGA development board. 

 

Thank you. 

 

Here is the modified makefile for those interested. 

all: main.exe main.exe: main.o arm-linux-gnueabihf-g++ -LC:\altera\14.0\hld\board\c5soc\arm32\lib -LC:/altera/14.0/hld/host/arm32/lib -lalteracl -lalterahalmmd -lalterammdpcie -lelf -lrt -lstdc++ -o main.exe main.o main.o: main.cpp arm-linux-gnueabihf-g++ -IC:/altera/14.0/hld/host/include -c main.cpp clean: rm main.o main.exe
0 Kudos
Reply