这更像是一个算法问题,而不是编程问题。我想知道是否可以修改前缀和(或任何)并行算法以完成以下操作。我想在不到 O(N) 的时间内从 GPU 上的两个输入列表生成结果。
规则是:从数据中取出第一个数字,直到键中的相同索引包含较小的值。
每当我尝试将其映射到并行扫描时,它都不起作用,因为我无法确定要在上行扫描中传播哪些数据值,因为无法知道哪些先前的数据可能已经传播到足以与当前键进行比较. 这个问题让我想起了我们需要考虑当前指数和所有过去指数的涟漪进位。
同样,不需要代码进行并行扫描(尽管那会很好),更希望了解如何完成或为什么不能完成。
int data[N] = {5, 6, 5, 5, 3, 1, 5, 5};
int keys[N] = {5, 6, 5, 5, 4, 2, 5, 5};
int result[N];
serial_scan(N, keys, data, result);
// Print result. should be {5, 5, 5, 5, 3, 1, 1, 1, }
串行扫描的代码如下:
void serial_scan(int N, int *k, int *d, int *r)
{
r[0] = d[0];
for(int i=1; i<N; i++)
{
if (k[i] >= r[i-1]) {
r[i] = r[i-1];
} else if (k[i] >= d[i]) {
r[i] = d[i];
} else {
r[i] = 0;
}
}
}