Сортировка по ключам> 10 целых последовательностей. с тягой

115
13

Я хочу выполнить sort_by_key где у меня есть одна последовательность клавиш и несколько последовательностей значений.

Обычно это выполняется с

sort_by_key(
key,
key + N,
make_zip_iterator(
make_tuple(x1 , x2 , ...)
)
)

Однако я хочу выполнить сортировку с> 10 последовательностями каждой длины N. Thrust не поддерживает кортежи размером> = 10. Так есть ли способ обойти это?

Конечно, можно сохранить отдельную копию key вектора и выполнить сортировку на пучках из 10 последовательностей. Но я хотел бы сделать все за один раз.

спросил(а) 2012-09-08T03:41:00+04:00 8 лет, 1 месяц назад
1
Решение
57

thrust::tuple hardcoded всегда имеет 10 элементов, поэтому нет прямого способа сформировать zip_iterator из более чем десяти отдельных итераторов и, следовательно, не будет сортировать более 10 разных итераторов ключом в одной плавной операции ( и неявным образом не передавать более 10 итераторов в пользовательский функтор).

Если вы действительно не можете придумать полезный способ объединить некоторые из отдельных векторов в один итератор (например, сформировать вектор значений кортежей), то альтернативой может быть использование итераторов перестановок. Если вы создаете массив из счетного итератора и сортируете его, то что-то вроде:

device_vector<int> indices(N);
copy(make_counting_iterator(0), make_counting_iterator(N), indices.begin());
sort_by_key(key, key+N, indices);

indices теперь содержат упорядоченные индексы в векторы, которые вы в противном случае отсортировали. Затем вы можете создать итератор перестановок, который можно использовать для "сбора" входных данных с помощью вашего ключа в качестве части последующих вызовов алгоритмов. Вы можете сделать так много итераторов перестановок по мере необходимости, и они могут быть перестановками итераторов zip для предоставления разных "представлений" из 12 итераторов ввода, которые вам понадобятся в последующем коде.

ответил(а) 2012-09-08T12:13:00+04:00 8 лет, 1 месяц назад
41

Фактически вы можете использовать простую операцию "разброса". Выполните только одну операцию "thrust :: sort_by_key", затем для каждого вектора данных примените операцию "тяга - разброс". Значения будут распределены по соответствующим местоположениям.

thrust::sequence(indices.begin(), indices.end());
thrust::sort_by_key(keyvals.begin(), keyvals.end(), indices.begin());

//now indices keep the locations of the sorted key values
foreach ( ... ) {
thrust::scatter(data.begin(), data.end(), indices.begin(), sorteddata.begin());
}


Операции по сбору и разбросу достаточно мощны и открывают много возможностей.

ответил(а) 2013-06-04T10:34:00+04:00 7 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема