gpt4 book ai didi

c++ - 创建openCL缓冲区会导致延迟

转载 作者:行者123 更新时间:2023-12-02 10:29:05 30 4
gpt4 key购买 nike

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

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创建大缓冲区?

最佳答案

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

关于c++ - 创建openCL缓冲区会导致延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63079533/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com