Упорный эквивалент cilk::reducer_list_append
У меня есть список из n интервалов или доменов. Я хотел бы разделить параллельно каждый интервал на k частей, составляющих новый список (неупорядоченный). Однако, большая часть подразделения не будет соответствовать определенным критериям и не должна быть добавлена в новый список.
cilk:: reducer_list_append расширяет идею параллельного сокращения до формирования списка с push_back. Таким образом, я могу собирать параллельно только действительные подинтервалы.
Каков основной способ решения задачи? Я подозреваю, что одним из способов было бы сформировать большой список NXK, а затем использовать параллельный фильтр и сжатие потока? Но я действительно надеюсь, что есть операция добавления списка сокращений, потому что nxk может быть очень большим.
1 ответ
Я новичок в этом форуме, но, возможно, вы найдете некоторые из них полезными. Если вы не зациклены на Thrust, вы также можете взглянуть на Arrayfire. Я узнал об этом совсем недавно, и это бесплатно для такого рода проблем.
Например, с помощью arrayfire вы можете оценить критерий выбора для каждого интервала параллельно, используя конструкцию gfor, т.е. рассматривать:
// # of intervals n and # of subintervals k
const int n = 10, k = 5;
// this array represets original intervals
array A = seq(n); // A = 0,1,2,...,n-1
// for each interval A[i], subI[i] counts # of subintervals
array subI = zeros(n);
gfor(array i, n) { // in parallel for all intervals
// here evaluate your predicate for interval's subdivision
array pred = A(i)*A(i) + 1234;
subI(i) = pred % (k + 1);
}
//array acc = accum(subI);
int n_total = sum<float>(subI); // compute the total # of intervals
// this array keeps intervals after subdivision
array B = zeros(n_total);
std::cout << "total # of subintervals: " << n_total << "\n";
print(A);
print(subI);
gfor(array i, n_total) {
// populate the array of new intervals
B(i) = ...
}
print(B);
конечно, это зависит от того, как представлены ваши интервалы и какой критерий вы используете для подразделения.