似乎在创建新的推力向量时,所有元素默认为 0 - 我只是想确认这将始终如此。
如果是这样,是否还有一种方法可以绕过负责此行为的构造函数以提高速度(因为对于某些向量,我不需要它们具有初始值,例如,如果它们的原始指针作为输出传递给 CUBLAS) ?
问问题
855 次
1 回答
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;
您仍将承担启动内核以调用的成本uninitialized_allocator::construct
,但该内核将是一个空操作,将很快退出。您真正感兴趣的是避免填充阵列所需的内存带宽,该解决方案就是这样做的。
这里有一个完整的示例代码。
请注意,此技术需要 Thrust 1.7 或更高版本。
于 2013-05-06T02:32:39.817 回答