新しい推力ベクトルを作成すると、すべての要素がデフォルトで 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 に答える