KhronosGroup / OpenCL-SDK

OpenCL SDK
Apache License 2.0
578 stars 120 forks source link

SVMAllocator is hardcoded using default CommandQueue #106

Closed sorayuki closed 6 months ago

sorayuki commented 6 months ago

When working with the C++ binding header, the class SVMAllocator comes with a constructor accepting a cl::Context parameter.

But when cl::vector with SVMAllocator constructing with default value, it will call a enqueueMapSVM and use cl::CommandQueue::getDefault to do the mapping. It may not associate with the cl::Context which the SVMAllocator belongs.

For example, take a look at this piece of code

template<class T>
using RWAlloc = cl::SVMAllocator<T, cl::SVMTraitCoarse<cl::SVMTraitReadWrite<>>>;

void DoTest(cl::Platform plat) {
    cl::vector<cl::Device> devices;
    ctx.plat.getDevices(CL_DEVICE_TYPE_ALL, &devices);
    cl::Context clctx(devices);
    cl::CommandQueue queue{ clctx };

    RWAlloc<int> rwalloc(clctx);
    std::vector<int, RWAlloc<int>> input(numElements, 1, rwalloc);
    ...

The code crashes when constructing input. It would be better if SVMAllocator comes with a CommandQueue parameter.

sorayuki commented 6 months ago

move to https://github.com/KhronosGroup/OpenCL-CLHPP/issues/294