KhronosGroup / OpenCL-CLHPP

Khronos OpenCL-CLHPP
Apache License 2.0
375 stars 130 forks source link

SVMAllocator is hardcoded using default CommandQueue #294

Open sorayuki opened 5 months ago

sorayuki commented 5 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 5 months ago

And also, after constructed the vector, memory block is mapped by default and since the kernel code can't output data into it.

It may confuse the newbies...