如果需要,我想使用 Thrust(因为我的大多数方法都是使用推力数据类型实现的)或 C CUDA 来仅对向量的正浮点元素求和。数据最初没有排序。我最初的尝试非常糟糕:基本上,复制向量,对其进行排序,通过将其传递给内核来找到零交叉,该内核比较顺序的成对值并写入与零交叉匹配的值。基本上在排序之后(我用推力做的)......
int i = blockIdx.x * blockDim.x + threadIdx.x;
if (i < n - 1) {
float a = vector[i];
float b = vector[i + 1];
if (a >= 0.0 && b < 0.0)
answer = i + 1;
}
这真是愚蠢,很多线程匹配条件,读取太多,分支分歧等。所以,它完全失败了,每次调用都会在相同的数据上给出不同的结果,等等。
我还没有找到在 Thrust 中实现这一点的好方法,这是我更喜欢的。排序后我不知道如何找到过零。关于这里的起点有什么建议吗?一个实际工作的简单 CUDA C 实现也可以。