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,
@ user1760748 anlamındadır: Bu cevap sizi tatmin ediyor mu? Değilse, lütfen bir sorun olup olmadığını belirtin ... – einpoklum