如何避免在thrust :: device_vector中默认构造元素?

mch*_*hen 8 c cuda gpgpu thrust

  1. 似乎在创建一个新的Thrust向量时,默认情况下所有元素都是0 - 我只是想确认这种情况总是如此.

  2. 如果是这样,是否还有一种方法绕过负责此行为的构造函数以获得额外的速度(因为对于某些向量,我不需要它们具有初始值,例如,如果它们的原始指针作为输出传递给CUBLAS) ?

Jar*_*ock 8

thrust::device_vector使用提供的分配器构造它包含的元素,就像std::vector.当向量要求分配器构造元素时,可以控制分配器的作用.

使用自定义分配器来避免向量元素的默认初始化:

// uninitialized_allocator is an allocator which
// derives from device_allocator and which has a
// no-op construct member function
template<typename T>
  struct uninitialized_allocator
    : thrust::device_malloc_allocator<T>
{
  // note that construct is annotated as
  // a __host__ __device__ function
  __host__ __device__
  void construct(T *p)
  {
    // no-op
  }
};

// to make a device_vector which does not initialize its elements,
// use uninitialized_allocator as the 2nd template parameter
typedef thrust::device_vector<float, uninitialized_allocator<float> > uninitialized_vector;
Run Code Online (Sandbox Code Playgroud)

您仍将承担调用内核启动的成本uninitialized_allocator::construct,但该内核将是一个快速退出的无操作.您真正感兴趣的是避免填充阵列所需的内存带宽,这是该解决方案所做的.

有一个完整的示例代码在这里.

请注意,此技术需要Thrust 1.7或更高版本.