簡體   English   中英

我如何使用原始指針 thrust::sort() 或 thrust::sort_by_key()

[英]How do I thrust::sort() or thrust::sort_by_key() with raw pointers

我想使用帶有 thrust::sort() 和 thrust::sort_by_key() 的原始設備指針對數組進行排序,因為它使用基數排序。 數據位於原始 uint64_t 設備指針中,我使用隨機元素進行初始化以進行測試。 我查看了推力庫,看到了一些簡單地傳入一個數組變量和數組變量加上大小的示例,以傳遞數組的開頭和結尾。 當我調用 sort 方法時,它會拋出一個運行時錯誤,提示Exception thrown: read access violation. thrust::identity<unsigned __int64>::operator()(...) returned 0x701A00000. Exception thrown: read access violation. thrust::identity<unsigned __int64>::operator()(...) returned 0x701A00000. 我不確定是什么原因造成的,因為我不熟悉使用推力進行排序。

下面是一些示例代碼來展示我是如何調用它的:

uint64_t size = 1024ull;
uint64_t* data;
cudaMalloc((void**)&data, size * sizeof(uint64_t));
curandGenerator_t gen;
curandCreateGenerator(&gen, CURAND_RNG_QUASI_SOBOL64);
curandSetPseudoRandomGeneratorSeed(gen, 132748238ull);
curandGenerateLongLong(gen, data, size);
curandDestroyGenerator(gen);
thrust::sort(data, data + size);

TLDR:

調用排序function如下:

thrust::sort(thrust::device, data, data + size);

細節:

如果您將原始指針傳遞給推力算法(例如thrust::sort ),它無法確定該指針是指向主機還是設備上的 memory 位置。 默認情況下,算法的執行被分派到主機后端 (CPU)。 這意味着,如果數據指針指向設備 memory,它將導致您遇到的崩潰。

這就是執行策略的用武之地。執行策略允許我們明確指定將算法執行分派到的后端。 如果您確定分配的 memory 的位置,您可以明確指定目標后端(如上例中指定的那樣)。

替代方法:

如果您不想使用執行策略,另一種方法是將原始設備指針包裝到thrust::device_ptr object 中,如下所示:

auto dptr = thrust::device_ptr<uint64_t>(data); 
thrust::sort(dptr , dptr + size);

推力文檔中所述:

在 device_ptr 類型上運行的算法將自動分派到設備系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM