2013-03-25 8 views
7

Thrust kitaplığı verileri sıralamak için kullanılabilir. d_keys ve d_values işlemci bellekte olmak üzere CPU çağırdıCUDA: doğrudan GPU üzerinde itme :: sort_by_key nasıl kullanılır?

thrust::sort_by_key(d_keys.begin(), d_keys.end(), d_values.begin()); 

;: Çağrı (a tuşları ve değerler vektörü ile) aşağıdaki gibi görünebilir ve yürütmenin büyük kısmı GPU’da gerçekleşir.

Verilerim zaten GPU'da mı? Thrust kitaplığını, doğrudan GPU üzerinde verimli bir sıralama yapmak için, yani bir çekirdekten sort_by_key işlevini çağırmak için nasıl kullanabilirim?

Ayrıca benim veriler her zaman unsigned int ya unsigned long long int veya unsigned int ve verilerdir tuşların oluşur. Bu tipler için itme çağrısını nasıl yapmalıyım?

cevap

6

Bağlı Talonmies sorgusunda belirtildiği gibi, bir CUDA işlevinden Thrust'u (ör. __device__ veya __global__) arayamazsınız. Ancak bu, cihaz belleğinizde sahip olduğunuz verileri Thrust ile kullanamayacağınız anlamına gelmez. Bunun yerine, ham verilerinizi sarmalayan Thrust vektörlerini kullanarak ana bilgisayardan istenen Thrust işlevlerini çağırırsınız. Örneğin.

//raw pointer to device memory 
unsigned int * raw_data; 
unsigned int * raw_keys; 
//allocate device memory for data and keys 
cudaMalloc((void **) &raw_data, N_data * sizeof(int)); 
cudaMalloc((void **) &raw_keys, N_keys * sizeof(int)); 

//populate your device pointers in your kernel 
kernel<<<...>>>(raw_data, raw_keys, ...); 

... 

//wrap raw pointer with a device_ptr to use with Thrust functions 
thrust::device_ptr<unsigned int> dev_data_ptr(raw_data); 
thrust::device_ptr<unsigned int> dev_keys_ptr(raw_keys); 

//use the device memory with a thrust call 
thrust::sort_by_key(d_keys, d_keys + N_keys, dev_data_ptr); 

cihaz hafızası raw_data tarafından işaret ve ana bilgisayardan İtme işlevini çağırarak yaparken, herhangi bir bellek kopyalamak zorunda değildir bu yüzden, Thrust::device_ptr ile sarın zaman raw_keys cihaz hafızasında hala ev sahibinden cihaza veya tam tersi. Yani, cihaz hafızasını kullanarak doğrudan GPU’da sıralıyorsunuz; Sahip olduğunuz tek ek yük, Thrust çekirdeğini (çekirdeklerini) başlatma ve ham aygıt işaretleyicilerini sarmalamadır.

Ve

sen sonra düzenli CUDA çekirdeğine bunları kullanmanız gerekiyorsa elbette, geri ham işaretçileri alabilirsiniz: unsigned int var verilerle tuşları olarak ya unsigned long long int veya unsigned int kullanarak gelince

unsigned int * raw_ptr = thrust::raw_pointer_cast(dev_data_ptr); 

, Thrust templated olduğu için bu bir problem değil. Yani sort_by_key için imza

template<typename RandomAccessIterator1 , typename RandomAccessIterator2 > 
void thrust::sort_by_key(   
    RandomAccessIterator1 keys_first, 
    RandomAccessIterator1 keys_last, 
    RandomAccessIterator2 values_first) 

Eğer anahtarlar ve veriler için farklı türde olabilir yani olduğunu olduğunu. Belirli bir çağrı için tüm anahtar türleriniz homojen olduğu sürece, Thrust türlerini otomatik olarak çıkarabilmeli ve özel bir şey yapmanız gerekmeyecektir. Umarım bu,

+0

@ user1760748 anlamındadır: Bu cevap sizi tatmin ediyor mu? Değilse, lütfen bir sorun olup olmadığını belirtin ... – einpoklum