我发现设计一个并行方法很难在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 };
非常感谢任何帮助
答案 0 :(得分:3)
您正在寻找的并行原语称为流压缩,并且在读取库中有许多流压缩实现。
例如,推力包括两个不同的stream compaction操作,copy_if
和remove_if
,可用于您的目的。优秀的CUB库包括DeviceSelect,它还执行流压缩。 DPP库还包括流压缩例程。我相信其中一个可以根据你的口味适应你的问题。