使用 CUDA/thrust 在数组中设置每个 float4 的一个元素

Set one element of each float4 in an array using CUDA/thrust

我在 GPU 上有一个相当标准的 float4 class 和一个 float4 数组。每个 float4 代表一个 (x,y,z,rgba) 点,我想使用推力将数组中每个 float4 的 rgba 值设置为特定值。似乎 thrust::fill() 可以与自定义迭代器一起使用,但我不知道如何编写推力迭代器。关于如何执行此操作的任何想法?

(x1, y1, z1, c1), (x2, y2, z2, c2), .... --> (x1, y1, z1, value), (x2, y2, z2, value), ....

Seems like thrust::fill() might work with a custom iterator

不会。 fill 是简单的分配。目标迭代器未被读取,因此无法修改。您不想对迭代器范围进行赋值,而是想修改现有的迭代器范围。 transform 将是正确的算法。

写一个仿函数,像这样:

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);

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