9
  1. 新しい推力ベクトルを作成すると、すべての要素がデフォルトで 0 になるようです。これが常に当てはまることを確認したいだけです。

  2. もしそうなら、追加の速度のためにこの動作を担当するコンストラクターをバイパスする方法もあります(一部のベクトルでは初期値を持つ必要がないため、たとえば、生のポインターが出力として CUBLAS に渡される場合) ?

4

1 に答える 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 に答える