0

给定以下使用 OpenCL 1.2 的程序

#include <CL/cl.h>
#include <thread>

int main()
{
    std::this_thread::sleep_for(std::chrono::seconds{4});

    cl_platform_id plats[10];
    cl_uint count = 0;
    if (clGetPlatformIDs(10, plats, &count) != CL_SUCCESS)
        std::terminate();

    cl_device_id dev = nullptr;
    for (cl_uint i = 0; i < count && !dev; ++i) {

        cl_device_id devs[10];
        cl_uint dev_count = 0;
        if (clGetDeviceIDs(plats[i], CL_DEVICE_TYPE_GPU, 10, devs, &dev_count) != CL_SUCCESS)
            continue;

        for (cl_uint j = 0; j < dev_count && !dev; ++j) {
            cl_bool avail = false;
            if (clGetDeviceInfo(devs[j], CL_DEVICE_AVAILABLE, sizeof(avail), &avail, nullptr) != CL_SUCCESS)
                continue;

            if (avail)
                dev = devs[j];
        }
    }

    cl_int res = CL_SUCCESS;
    cl_context c = clCreateContext(nullptr, 1, &dev, nullptr, nullptr, &res);
    if (res != CL_SUCCESS)
        std::terminate();

    cl_command_queue cq = clCreateCommandQueueWithProperties(c, dev, nullptr, &res);
    if (res != CL_SUCCESS)
        std::terminate();

    cl_mem buf = clCreateBuffer(c, CL_MEM_READ_WRITE, 4096*4096, nullptr, &res);
    if (res != CL_SUCCESS)
        std::terminate();

    while (true) {

        static uint i = 0;
        constexpr uint num = 410;
        i = (i + num) % (4096 - num);

        void* p = clEnqueueMapBuffer(cq, buf, CL_TRUE, CL_MAP_READ, i*4096, num*4096, 0, nullptr, nullptr, &res);
        if (res != CL_SUCCESS)
            std::terminate();

        if (clEnqueueUnmapMemObject(cq, buf, p, 0, nullptr, nullptr) != CL_SUCCESS)
            std::terminate();

        std::this_thread::sleep_for(std::chrono::milliseconds{50});
    }
}

我发现在 while 循环中,每次迭代的内存使用量从 1% 逐渐增加,直到达到我 16 GB RAM 的大约 24%。终点因我的设定而异numCL_MEM_USE_HOST_PTR如果我使用并给出clCreateBuffer指针,则此行为将完全删除。我在一系列不同的设备上进行了测试,发现在使用 Intel 而不是 NVidia 或 AMD GPU 时它也消失了。这不是真正的内存泄漏,因为在调用clRelease*创建的 OpenCL 对象时会释放内存。

这是我对 API 的误解还是错误?

4

0 回答 0