在OpenCL内核代码中删除数组中的某些元素

在OpenCL内核代码中删除数组中的某些元素,opencl,Opencl,通过执行扫描操作压缩数组(将所需元素从输入数组放入输出数组)后,在放置所需元素后,输出(压缩)数组中可能会以连续形式保留一些空格。有没有一种方法可以在不返回主机的情况下释放OpenCL内核代码本身中的这些空格(只是为了删除) 例如,我有一个100个元素的输入数组,其中有些大于50,有些小于50,我想将大于50的元素存储在一个不同的数组中,只对该数组中的元素进行进一步处理,我不知道这个输出数组的大小,因为我不知道有多少个大于50(因此我声明此数组的大小为100)…然后在执行扫描后,我得到所有元素都

通过执行扫描操作压缩数组(将所需元素从输入数组放入输出数组)后,在放置所需元素后,输出(压缩)数组中可能会以连续形式保留一些空格。有没有一种方法可以在不返回主机的情况下释放OpenCL内核代码本身中的这些空格(只是为了删除)

例如,我有一个100个元素的输入数组,其中有些大于50,有些小于50,我想将大于50的元素存储在一个不同的数组中,只对该数组中的元素进行进一步处理,我不知道这个输出数组的大小,因为我不知道有多少个大于50(因此我声明此数组的大小为100)…然后在执行扫描后,我得到所有元素都超过50的输出数组…但是在存储这些元素之后,输出数组中可能会有一些连续的空格为空…那么我们如何删除这些空格…在内核代码本身中是否有这样做的方法…?或者我们必须返回主机代码中进行此操作。。。?


如果我们不能删除内核代码本身中剩余的空格,并且我们不想返回到主机代码中,那么我们如何处理这种压缩数组以进行进一步处理?

恐怕您的问题没有简单的解决方案

我认为您可能会做的是,在每个数组中都有一个元素计数器。您可以先使用atomic_inc()局部递增计数器,然后使用atomic_add()全局递增计数器。 这样,在内核执行结束时,每个数组中的元素总数将出现


您还可以使用此原子操作作为数组的索引。这样您就可以在没有任何“孔”的情况下写入输出在您的数组中。但是,恐怕由于滥用原子操作,您可能会损失一些速度。

您无法更改数组的长度或内核中动态数据结构的大小。如果您打算调整数组大小以节省一些空间,则需要调整主机中数组的大小。我不确定“只是为了删除”是做你想做的事情的充分理由。顺便问一下,你想做什么?隐式删除这些空白的典型方法是对数组进行排序,使所有空白都位于开头(或结尾),找出有效元素的数量及其起始点,并在内核中仅处理数组的一部分。我在数组之间没有任何孔…空格在末尾,因为我已经对输入数组执行了如上所述的扫描操作。我只是想知道一种删除元素的方法我想这样做是因为如果最后有一些空间是空的,这会损害GPU的性能,因为一些线程保持空闲,使用一些GPU内存会被不必要地占用…!另一方面,我想说的是,有没有办法设置一个数组上实际执行的线程数的限制?例如,我有100个元素的数组,但我只让50个线程在它们上运行…?有没有这样的方法来限制全局大小的末端…?如果你已经知道元素的数量,并且元素位于数组的开头。那么解决方案就很简单了。拥有一个大数组并且只使用开头不会影响你的速度。Just将全局大小缩小到新的所需大小。但是,我以前不知道大小,此大小将在内核中计算…!然后使用原子_inc()计算每个数组中的元素数。