2015-10-08 7 views
0

В частности, как я мог отсортировать массив из float3? Так, что компоненты .x являются основными критериями сортировки, компоненты .y являются вторичными критериями сортировки, а компоненты .z являются критериями сортировки третичного типа.Как отсортировать массив типов векторов CUDA

Есть ли простое решение, которое может сделать один звонок до cub:: DeviceRadixSort или thrust::sort_by_key?

На данный момент я имею в виду, может быть, я мог бы создать uint32 ключевой массив, где каждый элемент имеет первую треть своих цифр, взятые из первой трети .x компонентов входного массива, вторая треть цифр взята из первых третья часть составляющих входного массива .y и последняя треть ее цифр, взятых из первой трети компонентов .z входного массива. Или есть лучшее решение?

+1

Вы можете использовать метод, подобный [this] (http://stackoverflow.com/questions/29597224/sorting-packed-vertices-with-thrust). Вам нужна 'sort_by_key'? Мне непонятно, из этого вопроса, что вы делаете. Вам просто нужно построить функтор тяги, который устанавливает правильное упорядочение, которое вы хотите. –

+0

Ваше право. Мне не нужен ключ, я просто подумал, что это будет полезный инструмент, чтобы не извлекать отдельные элементы. Решение, на которое вы указали, выглядит очень полезным, хотя я не особенно знаком с функторами. У вас есть хороший пример/пример для них? В частности, что объясняет аргументы функтора? – inJeans

+1

Функтор - объект функции C++. Если вы Google, вы найдете множество справочных руководств, таких как [этот] (http://www.cprogramming.com/tutorial/functors-function-objects-in-c++.html). Это не принципиальная концепция. Кроме того, толчок [руководство по быстрому запуску] (https://github.com/thrust/thrust/wiki/Quick-Start-Guide) полезен, хотя он специально не фокусируется на функторах. Функторы - достаточно важные инструменты, если вы хотите сделать программирование тяги. Но кроме того, тривиальная модификация приведенного ранее примера может быть использована для сортировки массива 'float3' в тяге. –

ответ

2

Использование example, который предложил Robert Crovella. Я разработал следующее решение. Еще раз спасибо.

#include <thrust/sort.h> 
#include <thrust/device_ptr.h> 

struct sort_float3 { 
    __host__ __device__ 
    bool operator()(const float3 &a, const float3 &b) const { 

    if  (a.x <= b.x && a.y <= b.y && a.z < b.z) return true; 
    else if (a.x <= b.x && a.y < b.y) return true; 
    else if (a.x < b.x) return true; 
    else return false; 
    } 
}; 

int main(void) 
{ 
    float3 *h_array; 
    // Define your host array 
    float3 *d_array; 
    cudaMallocHost((void**)&d_array, 
        number_of_elements * sizeof(float3));  
    cudaMemcpy(d_array, 
       h_array, 
       number_of_elements * sizeof(float3), 
       cudaMemcpyHostToDevice); 

    thrust::device_ptr<float3> th_array(d_array); 
    thrust::sort(th_array, 
        th_array+number_of_elements , 
        sort_float3()); 
    return 0; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^