CUDA推力-选择性复制或替换为常量值

CUDA推力-选择性复制或替换为常量值,cuda,thrust,gpu,Cuda,Thrust,Gpu,我有一个要求,我想使用CUDA推力并行化以下内容 std::vector<float> a, b, c; // size of each is (size.x * size.y * size.z), kind of a 3D array. 我尝试过的是使用推力::for_each,但我找不到一种方法将开发c[I]分配给开发a[I] 我希望能朝着正确的方向推进,也许哪一个推力:api是最合适的。提前感谢。在做了更多的挖掘之后,我找到了正确的推力api 它是replace_copy_

我有一个要求,我想使用CUDA推力并行化以下内容

std::vector<float> a, b, c; // size of each is (size.x * size.y * size.z), kind of a 3D array.
我尝试过的是使用
推力::for_each
,但我找不到一种方法将
开发c[I]
分配给
开发a[I]


我希望能朝着正确的方向推进,也许哪一个推力:api是最合适的。提前感谢。

在做了更多的挖掘之后,我找到了正确的推力api

它是replace_copy_的重载,如果它将作为复制值的条件的“模具”作为输入

在我的例子中,“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);
struct小于零
{
__主机设备布尔运算符()(浮点x)
{
返回x<0;
}
};
是_小于_小于_零pred{};
推力::如果(推力::装置,c.开始(),c.结束(),则更换,
b、 begin(),a.begin(),pred(),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, j, z)] < 0) ?
                                        (0) : (1 * c.data[get_idx(i, j, z)]);
        }
thrust::device_vector<float> dev_a, dev_b, dev_c;
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);