【问题标题】:Read/Write OpenCL memory buffers on multiple GPU in a single context在单个上下文中读取/写入多个 GPU 上的 OpenCL 内存缓冲区
【发布时间】:2026-01-11 08:10:01
【问题描述】:

假设系统具有两个不同的 GPU,但来自同一供应商,因此可以从单个 OpenCL 平台访问它们。鉴于以下简化 OpenCL 代码:

float* someRawData;

cl_device_id gpu1 = clGetDeviceIDs(0,...);
cl_device_id gpu2 = clGetDeviceIDs(1,...);
cl_context ctx = clCreateContext(gpu1,gpu2,...);

cl_command_queue queue1 = clCreateCommandQueue(ctx,gpu1,...);
cl_command_queue queue2 = clCreateCommandQueue(ctx,gpu2,...);

cl_mem gpuMem = clCreateBuffer(ctx, CL_MEM_READ_WRITE, ...);
clEnqueueWriteBuffer(queue1,gpuMem,...,someRawData,...);
clFinish(queue1);

在执行结束时,someRawData 是在两个 GPU 内存中还是仅在 gpu1 内存中?

【问题讨论】:

  • 我相当肯定主机数据只会被复制到 gpu1... 我不确定是否会在两个设备上分配空间。该规范在这里不是很有帮助。我有一个有两个 GPU 的系统在工作——如果我有时间,我明天会尝试一下。

标签: memory-management opencl gpu


【解决方案1】:

这取决于实现,数据将在调用clFinish() 后存储,但很可能会在队列引用的 GPU 上。此外,这种抽象使得从在queue2 上启动的内核访问gpuMem 成为可能,而无需显式数据传输。

【讨论】: