我试图使用推力指数为每个给设备矢量某些值 这里是代码如何获得推力的foreach
const uint N = 222222;
struct assign_functor
{
template <typename Tuple>
__device__
void operator()(Tuple t)
{
uint x = threadIdx.x + blockIdx.x * blockDim.x;
uint y = threadIdx.y + blockIdx.y * blockDim.y;
uint offset = x + y * blockDim.x * gridDim.x;
thrust::get<0>(t) = offset;
}
};
int main(int argc, char** argv)
{
thrust::device_vector <float> d_float_vec(N);
thrust::for_each(
thrust::make_zip_iterator(
thrust::make_tuple(d_float_vec.begin())
),
thrust::make_zip_iterator(
thrust::make_tuple(d_float_vec.end())
),
assign_functor()
);
std::cout<<d_float_vec[10]<<" "<<d_float_vec[N-2]
}
d_float_vec的输出[N-2]被认为是222220;但事实证明1036.我的代码怎么了?
我知道我可以使用thrust :: sequence给这个向量赋一个序列值。我只想知道如何获得推力foreach函数的真实指数。谢谢!
为什么输出应该是N-2? – talonmies 2012-08-05 13:31:12
uint x = threadIdx.x + blockIdx.x * blockDim.x; uint y = threadIdx.y + blockIdx.y * blockDim.y; uint offset = x + y * blockDim.x * gridDim.x;偏移量是索引。我希望每个矢量都有自己的索引 – user1536720 2012-08-05 14:37:28
是的,但是您隐式假定每个线程正好处理数组中的1个输出点,并且在您计算的2D线索索引与数组中的某个位置之间存在直接关系。这些事情都不一定是真的。 – talonmies 2012-08-05 15:11:39