创建 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;
所以我已经有了一个内核,它创建了一个单纯形噪声值数组
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;