创建 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 缓冲区会导致延迟的主要内容,如果未能解决你的问题,请参考以下文章