Parallel processing 使用CUDA/推力设置阵列中每个float4的一个元素

Parallel processing 使用CUDA/推力设置阵列中每个float4的一个元素,parallel-processing,cuda,gpu,thrust,Parallel Processing,Cuda,Gpu,Thrust,我在GPU上有一个相当标准的float4类和一个float4数组。每个float4表示一个(x,y,z,rgba)点,我想使用推力将数组中每个float4的rgba值设置为特定值。似乎推力::fill()可以与自定义迭代器一起使用,但我不知道如何编写推力迭代器。有什么办法吗 (x1, y1, z1, c1), (x2, y2, z2, c2), .... --> (x1, y1, z1, value), (x2, y2, z2, value), .... 似乎推力::填充()可以与自定义

我在GPU上有一个相当标准的float4类和一个float4数组。每个float4表示一个(x,y,z,rgba)点,我想使用推力将数组中每个float4的rgba值设置为特定值。似乎推力::fill()可以与自定义迭代器一起使用,但我不知道如何编写推力迭代器。有什么办法吗

(x1, y1, z1, c1), (x2, y2, z2, c2), .... --> (x1, y1, z1, value), (x2, y2, z2, value), ....
似乎
推力::填充()
可以与自定义迭代器一起使用

不会的<代码>填充是一种简单的分配。目标迭代器未读取,因此无法修改。您不希望在迭代器范围上执行赋值,而是希望修改现有迭代器范围<代码>变换将是正确的算法

编写一个函子,类似于:

struct set_c
{
  float y;

  __host__ __device__
  set_c(const float val) : y(val) {};

  __host__ __device__
  myfloat4 operator()(const myfloat4& x)
  {
      myfloat4 val = x;
      val.c = y;
      return val;
  }
};
然后在变换到位的情况下,将该函子应用于数据:

thrust::device_vector<myfloat4> data(bigconstant);
// something ...
set_c op(5.f); // set each myfloat4.c = 5.f
thrust::transform(data.begin(), data.end(), data.begin(), op);
推力::设备向量数据(bigconstant);
//有些事。。。
集合c op(5.f);//将每个myfloat4.c设置为5.f
转换(data.begin(),data.end(),data.begin(),op);
上面的所有代码显然都是在浏览器中编写的,而且从未靠近过编译器。自担风险使用

似乎
推力::填充()
可以与自定义迭代器一起使用

不会的<代码>填充是一种简单的分配。目标迭代器未读取,因此无法修改。您不希望在迭代器范围上执行赋值,而是希望修改现有迭代器范围<代码>变换将是正确的算法

编写一个函子,类似于:

struct set_c
{
  float y;

  __host__ __device__
  set_c(const float val) : y(val) {};

  __host__ __device__
  myfloat4 operator()(const myfloat4& x)
  {
      myfloat4 val = x;
      val.c = y;
      return val;
  }
};
然后在变换到位的情况下,将该函子应用于数据:

thrust::device_vector<myfloat4> data(bigconstant);
// something ...
set_c op(5.f); // set each myfloat4.c = 5.f
thrust::transform(data.begin(), data.end(), data.begin(), op);
推力::设备向量数据(bigconstant);
//有些事。。。
集合c op(5.f);//将每个myfloat4.c设置为5.f
转换(data.begin(),data.end(),data.begin(),op);

上面的所有代码显然都是在浏览器中编写的,而且从未靠近过编译器。使用风险自负。

谢谢!是的,这应该很好,这个函子方法将非常适合这个特殊的需要。虽然,我还需要在每个轴的列表中查找min元素,为此,我最好使用变换迭代器吗?对于像minima这样的操作,需要使用一个reduce。看,谢谢!是的,这应该很好,这个函子方法将非常适合这个特殊的需要。虽然,我还需要在每个轴的列表中查找min元素,为此,我最好使用变换迭代器吗?对于像minima这样的操作,需要使用一个reduce。看见