创建 openCL 缓冲区会导致延迟

Creating openCL buffers causes lag

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

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];

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

我假设您为每个帧/内核计算重复分配和删除 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;