gpt4 book ai didi

cuda - 仅对向量 CUDA/THRUST 的正元素求和

转载 作者:行者123 更新时间:2023-12-02 04:45:53 26 4
gpt4 key购买 nike

我想使用推力(因为我的大部分方法是使用推力数据类型实现的)或 C CUDA(如有必要)仅对向量的正浮点元素求和。数据最初未排序。我最初的尝试非常糟糕:基本上,复制向量,对其进行排序,通过将其传递给内核来找到零交叉,内核比较连续的成对值并写入与零交叉相匹配的值。基本上在排序之后(我用 Thrust 做)...

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 实现也很好。

最佳答案

要仅对正值求和,您不需要对初始值进行排序,请使用推力::transform_reduce:

template<typename T>
struct positive_value : public thrust::unary_function<T,T>
{
__host__ __device__ T operator()(const T &x) const
{
return x < T(0) ? 0 : x;
}
};

float result = thrust::transform_reduce(data.begin(), data.end(),
positive_value<float>(),
0,
thrust::plus<float>());

关于cuda - 仅对向量 CUDA/THRUST 的正元素求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19795846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com