Ios 金属结构中的快速角点检测

Ios 金属结构中的快速角点检测,ios,metal,compute-shader,corner-detection,Ios,Metal,Compute Shader,Corner Detection,我正在考虑如何在金属中实现快速角点检测。内核函数的输入是一个纹理,其中要检测角点,所有内核函数的结果是所有检测到的角点的列表。因此,每个内核函数可能会添加一个角点,也可能不会。我的问题是如何在设备缓冲区中累积所有发现的角点。在更糟糕的情况下,我会为每个内核函数分配一个单独的索引,在这里它应该写一个布尔值,但它将是一个非常稀疏的数组,并且不必要地庞大。因此,我不希望预先分配索引,而是希望核函数在检测到角点时以某种方式获得下一个可用索引。所以我想我应该在整数索引变量上使用原子交换来实现这一点。因此,

我正在考虑如何在金属中实现快速角点检测。内核函数的输入是一个纹理,其中要检测角点,所有内核函数的结果是所有检测到的角点的列表。因此,每个内核函数可能会添加一个角点,也可能不会。我的问题是如何在设备缓冲区中累积所有发现的角点。在更糟糕的情况下,我会为每个内核函数分配一个单独的索引,在这里它应该写一个布尔值,但它将是一个非常稀疏的数组,并且不必要地庞大。因此,我不希望预先分配索引,而是希望核函数在检测到角点时以某种方式获得下一个可用索引。所以我想我应该在整数索引变量上使用原子交换来实现这一点。因此,下一个\u free\u索引是一个共享变量,对于找到的每个角点,它都会以线程安全的方式递增。缺点是,GPU线程在访问此变量时可能会暂停,这会降低计算速度。我想知道这是否是一种合理的方法。

我很确定这在很大程度上是着色器中原子学的预期用途。原子操作应该是无锁的,尽管可能存在一些缓存和内存通道协调机制,使其比正常增量或其他任何操作都慢。因此,它可能会对性能产生一些影响,但不会太坏。此外,如果很少调用内核函数,实际上找到了角点(“非常稀疏”),那么争用将很低。当然,如果没有其他方法,那么性能就糟透了谢谢:)我希望性能比CPU上的性能高出一倍,尽管存在争用。我想知道线程组中较新GPU上的线程是否在lockstep中运行(所有线程都在同一条指令上,并且在条件上暂停(如果else发散),直到其他线程被捕获)。如果他们这样做的话,这就增加了他们可能同时处于竞争中的可能性?我对GPU的内部工作机制了解不够,无法说出锁步的概念,但你是否希望在彼此附近检测到角点?如果不是,那么线程组就不比任何其他线程更可能争夺原子。也就是说,组中(大约)一次只能有一个线程在原子上运行。在任何情况下,我希望您将获得比使用CPU好几个数量级的性能!做了更多的研究。锁步被限制为一个扭曲-这是16或32线程,所以你怀疑不太可能有争用。warp是SIMD,因此它优化了线程的指令获取周期。