1

我正在尝试对每个使用推力来为设备矢量提供某些值这里是代码

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 函数的真实索引。谢谢!

4

1 回答 1

3

正如评论中所指出的,您的方法永远不可能奏效,因为您已经假设了许多关于thrust::for_each内部工作方式的事情可能不正确,包括:

  • 您隐含地假设for_each使用单个线程来处理每个输入元素。几乎可以肯定不是这样。在操作期间,推力更有可能在每个线程中处理多个元素。
  • 您还假设执行按顺序发生,以便第 N 个线程处理第 N 个数组元素。情况可能并非如此,执行可能以无法先验的顺序发生
  • 您假设for_each在单个内核 laumch 中处理整个输入数据集

推力算法应被视为内部操作未定义的黑匣子,实现用户定义的函子不需要了解它们。在您的示例中,如果您需要仿函数内的顺序索引,请传递一个计数迭代器。重写示例的一种方法是:

#include "thrust/device_vector.h"
#include "thrust/for_each.h"
#include "thrust/tuple.h"
#include "thrust/iterator/counting_iterator.h"

typedef unsigned int uint;
const uint N = 222222; 
struct assign_functor
{
  template <typename Tuple>
  __device__ 
  void operator()(Tuple t)
  {  
    thrust::get<1>(t) = (float)thrust::get<0>(t);
  }
};

int main(int argc, char** argv)
{ 
  thrust::device_vector <float> d_float_vec(N);  
  thrust::counting_iterator<uint> first(0);
  thrust::counting_iterator<uint> last = first + N;

  thrust::for_each(
    thrust::make_zip_iterator( 
      thrust::make_tuple(first, d_float_vec.begin()) 
    ), 
    thrust::make_zip_iterator( 
      thrust::make_tuple(last, d_float_vec.end())
    ), 
    assign_functor()
  );

  std::cout<<d_float_vec[10]<<" "<<d_float_vec[N-2]<<std::endl; 
}

在这里,计数迭代器与数据数组一起传入一个元组,允许仿函数访问与它正在处理的数据数组条目相对应的顺序索引。

于 2012-08-05T20:16:43.093 回答