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?
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)?
8
A
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.
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.
Ç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
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
En son Thrust ile bir hata ayıklayıcısında ilerlemeniz gerekebilir. Bu karmaşık bir gönderi. –