创建 openCL 缓冲区会导致延迟

Posted

技术标签:

【中文标题】创建 openCL 缓冲区会导致延迟【英文标题】:Creating openCL buffers causes lag 【发布时间】:2020-11-14 16:07:06 【问题描述】:

所以我已经有一个内核,它可以创建一个单纯形噪声值数组

int *landmap_flags = new int[68 * 68 * 68];
_clw.CLNoise(landmap_flags, clpos, LOD, chunkSize);

这很好用,允许我在 GPU 上计算噪声,但是,我编写了另一个内核来根据噪声值生成顶点,并且我需要 3 个新缓冲区来存储顶点信息。

cl_float3* triangle_flags = new cl_float3[12 * 64 * 64 * 64];
cl_float3* normal_flags = new cl_float3[12 * 64 * 64 * 64];
cl_float3* index_flags = new cl_float3[6 * 64 * 64 * 64];

即使不运行新内核,也只允许创建一个新缓冲区,程序需要额外的 30 秒才能启动,并且从正常的 200 帧下降到每秒 10 帧。我使用 new 是因为我读到堆栈上这么大的缓冲区会导致堆栈溢出。有没有更好的方法为 openCL 创建大缓冲区?

【问题讨论】:

【参考方案1】:

我想您在 CPU 端为每个帧/内核计算重复分配和删除这些 cl_float3* 缓冲区。缓冲区分配当然很慢。

解决方案是在开始时只分配一次缓冲区,然后一遍又一遍地重复使用它们,而不是

while(true) 
    cl_float3* triangle_flags = new cl_float3[12 * 64 * 64 * 64];
    // do PCIe data transfer and some kernel call / calculation
    delete[] triangle_flags;

这样做:

cl_float3* triangle_flags = new cl_float3[12 * 64 * 64 * 64];
while(true) 
    // do PCIe data transfer and some kernel call / calculation

delete[] triangle_flags;

【讨论】:

以上是关于创建 openCL 缓冲区会导致延迟的主要内容,如果未能解决你的问题,请参考以下文章

OpenCL并行缓冲区压缩障碍问题

OpenCL 管道

如何在 OpenCL 内核中更新 OpenCL-OpenGL 共享缓冲区数据?

OpenCL 部分缓冲区 DMA 读/写

OpenCL 并行缓冲区压缩障碍问题

OpenCL 缓冲区大小填充