2013-05-05 12 views
8
  1. Yeni bir Thrust vektörü oluştururken görünen tüm öğeler varsayılan olarak 0'dır - Sadece bunun her zaman olacağından emin olmak istiyorum.Çekişteki öğelerin varsayılan yapılandırması nasıl önlenir :: device_vector?

  2. Eğer öyleyse, ayrıca bypass yapıcı bir yol yoktur onların ham işaretçileri ediliyor, bazı vektörler için ben bir başlangıç ​​değeri, örneğin olması onlara ihtiyacım yok çünkü (ek hız için bu davranışlarından sorumlu CUBLAS'a çıktı olarak geçti)?

cevap

7

thrust::device_vector sadece std::vector gibi, onun sağlanan ayırıcısı kullanarak içeren unsurlar oluşturur. Vektörün bir eleman inşa etmesini istediğinde, ayırıcının ne yaptığını kontrol etmek mümkündür.

vektör elemanlarının varsayılan başlatma önlemek için özel ayırıcısı kullanın: Hala uninitialized_allocator::construct çağırmak için bir çekirdek lansman maliyet yaratacağını

// 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; 

, ama bu çekirdek emekli olacak no-op olacak hızlı bir şekilde. Gerçekten ilgilendiğiniz şey, dizinin doldurulması için gerekli olan bellek bant genişliğinden kaçınmaktır.

Örnek bir kod here var.

Bu tekniğin Thrust 1.7 veya daha iyi bir sürüm gerektirdiğini unutmayın.

+0

Çok hoş. Daha önce stl için debug aşırı yükünü yazmasına rağmen, son yapı çağrısının burada olduğunu unuttum. Kazmaya devam etmeliydin. +1 :) – leander

+0

Aslında - kafam karıştı. Ben yanlış, 'senin' zincirleri, 'insert' için 'yeniden boyutlandırmak' hangi yeniden 'uninitialized_fill_n' içinde biten' fill_insert ', zincirleri' yeniden '? Yani hala yeni 'storage_type 'alanını oluştururken' yapısını' görmezden gelmesine rağmen hala kopya alıyorsunuz? ... tabii ki bir hata ayıklayıcısında bu adımı atmam gerekiyor, ancak varsayılan/başlangıçtaki x 'varsayılan argümanın başlangıçtaki uninitialized_fill_n'nın nasıl önlenebileceğini görmüyorum. – leander

+0

En son Thrust ile bir hata ayıklayıcısında ilerlemeniz gerekebilir. Bu karmaşık bir gönderi. –

İlgili konular