如何取消CUDA数组中的无效值

时间:2014-02-03 06:27:36

标签: cuda

我发现设计一个并行方法很难在CUDA数组中进行条件分区。

我给了三个数组,第一个和第二个数组包含数字,第三个布尔数组包括第一个和第二个数组中每个索引的状态,

我想从第1和第2个数组中排除无效数据点,最后将有效和invliad点存储在不同的数组上。

不幸的是,第1和第2个数组值之间的顺序很重要,例如:a [i]与b [i]有关。但是,相邻值之间的顺序无关紧要。

我不介意使用最新的CUDA库,扩展库或信任,我找不到如何以高标准并行方式实现此类方法。

给出一个例子:

int a[9] =       {5, 9 , 3, 2, 7 ,4  ,6  , 24, 1 };
int b [9] =      {7, 4 , 5, 2, 9 ,10 , 45, 67, 12}; 
bool isValid[9]= {t, f , t, t, t ,f  , f , t,  t };

// I'd like to get the output 

int a[] =       {5, 3, 2, 7 ,24, 1 };
int b [] =      {7, 5, 2, 9 ,67, 12}; 
bool isValid[]= {t, t, t, t , t,  t };

非常感谢任何帮助

1 个答案:

答案 0 :(得分:3)

您正在寻找的并行原语称为流压缩,并且在读取库中有许多流压缩实现。

例如,推力包括两个不同的stream compaction操作,copy_ifremove_if,可用于您的目的。优秀的CUB库包括DeviceSelect,它还执行流压缩。 DPP库还包括流压缩例程。我相信其中一个可以根据你的口味适应你的问题。