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

C++ 创建openCL缓冲区会导致延迟,c++,kernel,gpu,opencl,C++,Kernel,Gpu,Opencl,我已经有了一个内核,它创建了一个单纯形噪声值数组 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

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

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\u float3*
缓冲区。缓冲区分配当然很慢

解决方案是在开始时只分配一次缓冲区,并反复重用它们,因此

while(true){
cl_float3*三角形_标志=新cl_float3[12*64*64*64];
//执行PCIe数据传输和一些内核调用/计算
删除[]个三角形标志;
}
这样做:

cl_float3*triangle_flags=新的cl_float3[12*64*64*64];
while(true){
//执行PCIe数据传输和一些内核调用/计算
}
删除[]个三角形标志;

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

解决方案是在开始时只分配一次缓冲区,并反复重用它们,因此

while(true){
cl_float3*三角形_标志=新cl_float3[12*64*64*64];
//执行PCIe数据传输和一些内核调用/计算
删除[]个三角形标志;
}
这样做:

cl_float3*triangle_flags=新的cl_float3[12*64*64*64];
while(true){
//执行PCIe数据传输和一些内核调用/计算
}
删除[]个三角形标志;