将数组重新排序到位

时间:2014-12-10 04:43:03

标签: cuda

我正在研究使用CUDA的模拟算法,并且已经解决了删除数组数据的问题。

我有一个数组,我想移动数据,从删除的数据填充空洞(数组的末尾将被删除)。这显然可以按顺序完成,但这并没有充分利用CUDA的全部功能。我希望这可以并行完成。

我可以使用thrust::scatter和两个数组而不是一个数组来完成此操作,但它是否能够在原地进行此操作?

2 个答案:

答案 0 :(得分:1)

推力有各种各样的stream compaction options。您应该能够使用thrust::remove_if完成此操作,假设您要执行的操作是删除数据(仅限),即保留保留数据的排序

根据您识别要删除的项目的方式,您可以使用a version that works only on the data itself(也许如果您已通过将项目标记为负数或零来标记要删除的项目等)。

或者,如果您有其他向量("模具"),表示要删除的项目,there is a version for that

任一版本都在提供的输入向量上运行"就位"。

这是一个简单的例子,从推力文档中提取,使用第二个"模板"方法:

#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

答案 1 :(得分:-2)

在阅读了更多推力的源代码后,我能够回答上述问题,因为它能够在一个地方重新排序数组。但它根本不是平行的。实际上,它是使用for_each实现的,它是为CUDA顺序实现的。