2013-05-05 17 views
8
  1. Wydaje się podczas tworzenia nowego wektorem ciągu wszystkie elementy są domyślnie 0 - Po prostu chcę, aby potwierdzić, że będzie to zawsze być.Jak uniknąć domyślnej konstrukcji elementów w ciągu :: device_vector?

  2. Jeśli tak, to istnieje również sposób obwodnicy konstruktora odpowiedzialna za to zachowanie dla dodatkowej prędkości (od kilku wektorów nie muszę je mieć wartość początkową, na przykład wtedy, gdy ich surowe wskaźniki są poddawane przekazane do CUBLAS jako wynik)?

Odpowiedz

7

thrust::device_vector konstruuje poszczególnych pierwiastków za pomocą dostarczonej przydzielania, podobnie jak std::vector. Można kontrolować, co robi alokator, gdy wektor prosi o skonstruowanie elementu.

użyć niestandardowego przydzielania uniknąć domyślnego inicjalizację elementów wektorowych:

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

Będziesz nadal ponosić koszt uruchomienia jądra powołać uninitialized_allocator::construct, ale jądro będzie no-op, który przejdzie na emeryturę szybko. Tym, co naprawdę cię interesuje, jest uniknięcie przepustowości pamięci wymaganej do wypełnienia tablicy, którą to rozwiązanie wykonuje.

Istnieje pełny przykładowy kod here.

Należy pamiętać, że technika ta wymaga Thrust 1.7 lub lepszej.

+0

Bardzo ładne. Pomimo pisemnego przeciążenia przydziału debugowania dla stl wcześniej, zapomniałem, że ostateczne wywołanie konstrukcyjne było tutaj. Powinien nadal kopać. +1 :) – leander

+0

Właściwie - jestem zdezorientowany. Czy jestem w błędzie, że 'resize' w twoim łańcuchu przykładowym na' insert', który z kolei łączy się z 'fill_insert', który znowu kończy się na' uninitialized_fill_n'? Więc nadal otrzymujesz kopie, mimo że prawdopodobnie ignorujesz 'konstrukcję' podczas konfigurowania nowego obszaru' storage_type'? ... oczywiście muszę przejść przez to w debugerze, ale nie widzę, jak można uniknąć ostatecznego 'uninitialized_fill_n' od domyślnego/wartościowego inicjalizowanego' x' default arg. – leander

+0

Może zajść potrzeba przejścia przez debugger z najnowszym ciągiem. To skomplikowana wysyłka. –