使用 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);
上面的所有代码显然是在浏览器中编写的,从未接近过编译器。使用风险自负。
我在 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);
上面的所有代码显然是在浏览器中编写的,从未接近过编译器。使用风险自负。