2014-01-26 2 views
0

Я довольно новичок в разработке CUDA, и я пытаюсь сортировать массив структур, используя метод сортировки библиотеки тяги. Моя структура выглядит так:Как использовать массив struct в thrust :: sort?

#define N 307200  
struct distanceVector { 
    Point3D a, b; 
    float distance; 
}; 

Я хочу, чтобы отсортировать массив на «расстоянии», однако, функция сортировки требует два итераторов произвольного доступа и с тех пор я не использую векторы у меня нет никакого. Я пытался сделать что-то вроде этого:

bool distance_sort(distanceVector A, distanceVector B){ 
    return (A.distance > B.distance); 
} 

distanceVector * MyStructArray; 
cudaMalloc((void**)&MyStructArray, sizeof(distanceVector) * N); 
//LAUNCH KERNEL WHICH FILLS MYSTRUCTARRAY AND THEN... 
thrust::sort(MyStructArray, MyStructArray + N, distance_sort); 

... который я видел, как, например, в [руководство упорных в] [1]:

#include <thrust/sort.h> 
#include <thrust/functional.h> 
... 
const int N = 6; 
int A[N] = {1, 4, 2, 8, 5, 7}; 
thrust::stable_sort(A, A + N, thrust::greater<int>()); 
// A is now {8, 7, 5, 4, 2, 1} 

Хотя он собирает, во время выполнения я получаю Msgstr "Точка обнаружения нарушения доступа 0x405e041c." ошибка. При отладке приложения останавливается на этом участке в файле insertion_sort.h:

for(RandomAccessIterator i = first + 1; i != last; ++i) 
    { 
    value_type tmp = *i; 

    if (wrapped_comp(tmp, *first))....... 

Есть ли способ решить эту проблему без использования векторов упорных в?

+0

Покажите, как вы определяете 'N' и' MyStructArray'. –

+0

Я добавил изменения, которые вы предложили – Pepedou

ответ

1

Хорошо, поэтому я нашел свою ошибку. Проблема в том, что я пытаюсь использовать упор в памяти, который выделяется на устройстве. Сначала я попытался скопировать MyStructArray на хост-устройство, а затем использовать сортировку тяги, и она отлично работала. Чтобы работать с памятью устройства, я должен использовать указатель мыши: device_ptr <MyStruct> (MyStructArray). Надеюсь, это поможет кому-то другому.