More and more ways are getting available to bring easy OpenCL to you. Most of the convenience libraries are wrappers for other languages, so it seems that C and C++ programmers have the hardest time. Since a while my favourite way to go is Qt: it is multi-platform, has a good IDE, is very extensive, has good multi-core and OpenGL-support and… has an extension for OpenCL: http://labs.trolltech.com/blogs/2010/04/07/using-opencl-with-qt http://blog.qt.digia.com/blog/2010/04/07/using-opencl-with-qt/
Other multi-platform choices are Anjuta, CodeLite, Netbeans and Eclipse. I will discuss them later, but wanted to give Qt an advantage because it also simplifies your OpenCL-development. While it is great for learning OpenCL-concepts, please know that the the commercial version of Qt Creator costs at least €2995,- a year. I must also warn the plugin is still in beta.
streamhpc.com is not affiliated with Qt.
Qt Creator is available in most Linux-repositories: install packages ‘qtcreator’ and ‘qt4-qmake’. For Windows, MAC and the other Linux-distributions there are installers available: http://qt.nokia.com/downloads. People who are not familiar with Qt, really should take a look around on http://qt.nokia.com/.
You can get the source for the plugin QtOpenCL, by using GIT:
git clone http://git.gitorious.org/qt-labs/opencl.git QtOpenCL
See http://qt.gitorious.org/qt-labs/opencl for more information about the status of the project.
You can download it here: https://dl.dropbox.com/u/1118267/QtOpenCL_20110117.zip (version 17 January 2011)
For Linux and MAC you need to have the ‘build-essentials’. For Windows it might be a lot harder, since you need make, gcc and a lot of other build-tools which are not easily packaged for the Windows-OS. If you’ve made a win32-binary and/or a Windows-specific how-to, let me know.
You might have seen that people have problems building the plugin. The trick is to use the options -qmake and *-I* (capital i) with the configure-script:
- ./configure -qmake <location of qmake 4.6 or higher> -I
* make
Notice the spaces. The program qmake is provided by Qt (package ‘qt4-qmake’), the OpenCL-headers by the SDK of ATI or NVidia (you’ll need the SDK anyway), or by Khronos. By example, on my laptop (NVIDIA, Ubuntu 32bit, with Qt 4.7):
./configure -qmake /usr/bin/qmake-qt4 -I/opt/NVIDIA_GPU_Computing_SDK_3.2/OpenCL/common/inc/
make
This should work. On MAC the directory is not CL, but OpenCL – I haven’t tested it if Qt took that into account.
After building , test it by setting a environment-setting “LD_LIBRARY_PATH” to the lib-directory in the plugin, and run the provided example-app ‘clinfo’. By example, on Linux:
export LD_LIBRARY_PATH=
pwd
/lib:$LD_LIBRARY_PATHcd util/clinfo/
./clinfo
This should give you information about your OpenCL-setup. If you need further help, please go to the Qt forums.
Now it’s time to make a new project with support for OpenCL. This has to be done in two steps.
First make a project and edit the .pro-file by adding the following:
LIBS += -L
/lib -L -lOpenCL -lQtOpenCL INCLUDEPATH +=
/lib/
/src/opencl/
By example:
LIBS += -L/opt/qt-opencl/lib -L/usr/local/cuda/lib -lOpenCL -lQtOpenCL
INCLUDEPATH += /opt/qt-opencl/lib/
/usr/local/cuda/include/
/opt/qt-opencl/src/opencl/
The following screenshot shows how it could look like:
Second we edit (or add) the LD_LIBRARY_PATH in the project-settings (click on ‘Projects’ as seen in screenshot):
/usr/lib/qtcreator:location of opencl-plugin>:<location of OpenCL-SDK libraries>:
By example:
/usr/lib/qtcreator:/opt/qt-opencl/lib:/usr/local/cuda/lib:
As you see, we now also need to have the Qt-creator-libraries and SDK-libraries included.
The following screenshot shows the edit-field for the project-environment:
Just add something from the clinfo-source to your project:
printf("OpenCL Platforms:n"); QList platforms = QCLPlatform::platforms(); foreach (QCLPlatform platform, platforms) { printf(" Platform ID : %ldn", long(platform.platformId())); printf(" Profile : %sn", platform.profile().toLatin1().constData()); printf(" Version : %sn", platform.version().toLatin1().constData()); printf(" Name : %sn", platform.name().toLatin1().constData()); printf(" Vendor : %sn", platform.vendor().toLatin1().constData()); printf(" Extension Suffix : %sn", platform.extensionSuffix().toLatin1().constData()); printf(" Extensions :n"); } QStringList extns = platform.extensions(); foreach (QString ext, extns) printf(" %sn", ext.toLatin1().constData()); printf("n");
If it gives errors during programming (underlined includes, etc), focus on INCLUDEPATH in the project-file. If it complaints when building the application, focus on LIBS. If it complaints when running the successfully built application, focus on LD_LIBRARY_PATH.
Ok, it is maybe not that easy to get it running, but I promise it gets easier after this. Check out our Hello World, the provided examples and http://doc.qt.nokia.com/opencl-snapshot/ to start building.