使用 CUDA/thrust

问题描述

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

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

解决方法

似乎 thrust::fill() 可能适用于自定义迭代器

不会。 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);

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...