我是OpenCL的新手,我在某些方面陷入困境,我自己无法提出一个好的解决方案。 以下场景:我确实为交叉计算编写了一个内核,它运行得很好。我有很多光线和许多线条。我正在计算,每条线对每条线发生交叉,如下所示:
foreach ray{
foreach line{
pointXY = calculateIntersectionpoint();
}
}
现在让我们假设我输入了总共25000条光线和500条线,理论上我可以有12500000个交叉点。
然而,实际上并非如此。如果没有发生交叉,我的计算只会将交点设置为[0,0]。 现在我的问题是我有一个大小为12500000的输出阵列或(射线*线),其中大部分都包含零。之后我会找出没有交叉确实发生的点 - 但这是非常昂贵的,因为我的大部分申请时间都是通过整理这些点来浪费的。
我会从设备中读回结果,如下所示:
queue.enqueueReadBuffer(intersectionpointBuffer, CL_TRUE, 0, sizeof(cl_long2) * numberOfRays * numberOfLines, &intersectionPoints[0]);
现在我的问题是:有没有办法让可变大小的输出和" push_back"输出,每次我的内核找到一个交叉点? 如果不是这样,你有什么建议我可以解决这个问题吗? 我已经考虑过将输出留在设备上并在另一个内核中进行排序 - 然后切断我不感兴趣的区域。虽然我还不确定如何实现它。
如果这是相关的:我使用的是OpenCL 1.1,我的设备是Quadro 600,我使用的是opencl c ++包装器。
提前谢谢