Cuda 就地重新排序阵列

Cuda 就地重新排序阵列,cuda,Cuda,我正在研究一种使用CUDA的模拟算法,并最终解决了删除阵列数据的问题 我有一个数组,我想移动数据,填补删除数据的漏洞(数组的末尾将被删除)。这显然可以按顺序完成,但这并不是利用CUDA的全部力量。我希望这是并行的 我可以使用asch::scatter和两个数组(而不是一个数组)来实现这一点,但它是否能够在原地执行此操作?在阅读了更多的asch源代码后,我能够回答上述问题,因为它能够在原地重新排序数组。但这根本不是平行的。事实上,它是使用for_来实现的,for_是按顺序为CUDA实现的。推力有多

我正在研究一种使用CUDA的模拟算法,并最终解决了删除阵列数据的问题

我有一个数组,我想移动数据,填补删除数据的漏洞(数组的末尾将被删除)。这显然可以按顺序完成,但这并不是利用CUDA的全部力量。我希望这是并行的


我可以使用
asch::scatter
和两个数组(而不是一个数组)来实现这一点,但它是否能够在原地执行此操作?

在阅读了更多的asch源代码后,我能够回答上述问题,因为它能够在原地重新排序数组。但这根本不是平行的。事实上,它是使用for_来实现的,for_是按顺序为CUDA实现的。

推力有多种。如果,您应该能够使用
推力::删除_实现这一点,假设您想要做的是删除数据(仅),即保留保留数据的顺序

根据您识别要删除的项目的方式,您可以使用(如果您通过使项目为负数或零等方式标记要删除的项目,则可能会使用)

或者,如果您还有其他向量(“模具”)指示要删除的项目

任何一个版本都在提供的输入向量“就地”上运行

以下是一个简单的示例,摘自推力文档,使用第二种“模具”方法:

#包括
...
常数int N=6;
inta[N]={1,4,2,8,5,7};
int S[N]={0,1,1,1,0,0};
int*new_end=推力::移除(A,A+N,S,推力::identity());
//A的前三个值现在是{1,5,7}
//未指定新_端以外的值

推力::for_每个
都不是按顺序为CUDAIS实现的,您所说的“重新排序”实际上不是流压缩吗?
#include <thrust/remove.h>
...
const int N = 6;
int A[N] = {1, 4, 2, 8, 5, 7};
int S[N] = {0, 1, 1, 1, 0, 0};
int *new_end = thrust::remove(A, A + N, S, thrust::identity<int>());
// The first three values of A are now {1, 5, 7}
// Values beyond new_end are unspecified