给定以下使用 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%。终点因我的设定而异num
。CL_MEM_USE_HOST_PTR
如果我使用并给出clCreateBuffer
指针,则此行为将完全删除。我在一系列不同的设备上进行了测试,发现在使用 Intel 而不是 NVidia 或 AMD GPU 时它也消失了。这不是真正的内存泄漏,因为在调用clRelease*
创建的 OpenCL 对象时会释放内存。
这是我对 API 的误解还是错误?