如何解决CUDA Thrust-选择性复制或替换为恒定值
我有一个要求,我想使用CUDA推力并行化以下内容。
std::vector<float> a,b,c; // size of each is (size.x * size.y * size.z),kind of a 3D array.
我想做的是这个
a[i] = 0 if b[i] < 0
a[i] = c[i] if b[i] > 0
这是主机代码。
for (int i = 0; i < size.x; i++)
for (int j = 0; j < size.y; j++)
for (int z = 0; z < size.z; z++) {
a.data[get_idx(i,j,z)] = (b.data[get_idx(i,z)] < 0) ?
(0) : (1 * c.data[get_idx(i,z)]);
}
get_idx()
只是将循环索引转换为数组索引。
我想要的是一个等效的推力:: api来做到这一点。 我已经准备好推力:: device_vector,并将对应的a,b,c cuda的值复制到主机。
thrust::device_vector<float> dev_a,dev_b,dev_c;
我尝试使用thrust::for_each
,但找不到将dev_c[i]
分配给dev_a[i]
的方法。
我希望按正确的方向轻推,也许哪种推力:api最合适。预先感谢。
解决方法
经过更多挖掘之后,我找到了正确的推力api。
这是replace_copy_if的重载,它以一个“模具”作为输入,该“模具”充当根据其复制值的条件。
在我的情况下,“ b”是模具。
下面的代码现在可用。
struct is_less_than_zero
{
__host__ __device__ bool operator()(float x)
{
return x < 0;
}
};
is_less_than_zero pred{};
thrust::replace_copy_if(thrust::device,c.begin(),c.end(),b.begin(),a.begin(),pred(),0);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。