Search code examples
qtboostg++boost-compute

boost compute (opencl wrapper), initial setup problems (qt, g++)


Been trying to compile this sample code: https://github.com/boostorg/compute/blob/master/README.md

I installed QT Creator 5.7 using mingw530

I compiled the boost libraries using

bootstrap.bat gcc
b2 install --prefix="C:\Boostbuild" --toolset=gcc
bjam --build-dir=c:/Dev/Boost/Boost_lib toolset=gcc stage

I installed AMD SDK 3.0, 2.9.1, and 2.9

I even downloaded opencl 1.1, 1.2, and 2.1 cl.hpp and tried to include that.

The compile starts, but I get a slew of errors

C:\Dev\Boost\compute-master\include\boost\compute\device.hpp:80: error: undefined reference to `clRetainDevice@4'

C:\Users\User\Documents\Projects\build-console-test-Desktop_Qt_5_7_0_MinGW_32bit-Debug\debug\main.o:-1: In function `ZN5boost7compute6deviceaSERKS1_':

I tried a simple qt console app, using the code supplied by boost compute

Note: this isn't specific to qt, I've also tried compiling this using

g++ -I/path/to/compute/include sort.cpp -lOpenCL

doing an -I to each of the include's in the main.cpp (see below)

Ideally, I'd like to know how to compile the example given on their page, with includes and all (and relevant amd sdk and/or opencl versions) along with the necessary included libraries.

My qt project file libraries

INCLUDEPATH += C:\Dev\Boost\compute-master\include
INCLUDEPATH += C:/Users/User/Downloads/dev/boost_1_61_0
INCLUDEPATH += "C:\Program Files (x86)\AMD APP SDK\2.9-1\include"

My main.cpp

#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/compute.hpp>
//#define CL_USE_DEPRECATED_OPENCL_1_1_APIS
//#undef CL_VERSION_1_2
//#include <C:\Dev\OpenCL\2.1\cl.hpp>

namespace compute = boost::compute;

int main()
{

    // get the default compute device
    compute::device gpu = compute::system::default_device();

    // create a compute context and command queue
    compute::context ctx(gpu);
    compute::command_queue queue(ctx, gpu);

    // generate random numbers on the host
    std::vector<float> host_vector(1000000);
    std::generate(host_vector.begin(), host_vector.end(), rand);

    // create vector on the device
    compute::vector<float> device_vector(1000000, ctx);

    // copy data to the device
    compute::copy(
        host_vector.begin(), host_vector.end(), device_vector.begin(), queue
    );

    // sort data on the device
    compute::sort(
        device_vector.begin(), device_vector.end(), queue
    );

    // copy data back to the host
    compute::copy(
        device_vector.begin(), device_vector.end(), host_vector.begin(), queue
    );

    return 0;
}

if I uncomment out the include cl.hpp, I get further

C:/Dev/Boost/compute-master/include/boost/compute/allocator/buffer_allocator.hpp:91: undefined reference to `clReleaseMemObject@4'

Solution

  • The "slew of errors" are link errors because the location of the AMP APP SDK libraries (libOpenCL.a in this case) is missing.

    E.g. to link to the 32 bit version for MinGw, -lOpenCL becomes:
    -L"C:\Program Files (x86)\AMD APP SDK\2.9-1\lib\x86" -lOpenCL

    Or you could add the following to your qt .pro file:

    # Ensure that the AMDAPPSDKROOT environment variable has been set
    OPENCL_ROOT = $$(AMDAPPSDKROOT)
    isEmpty(OPENCL_ROOT) {
      error("Please set AMDAPPSDKROOT to the location of the AMD APP SDK")
    } else {
      message(Using Boost from: $$OPENCL_ROOT)
    }
    
    INCLUDEPATH += $$OPENCL_ROOT/include
    LIBS += -L$${OPENCL_ROOT}/lib/x86
    LIBS += -lOpenCL
    

    Note: the AMDAPPSDKROOT environment variable is normally created when you install the AMD APP SDK. In your case it should be set to:

    C:\Program Files (x86)\AMD APP SDK\2.9-1\