Упорный эквивалент 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);

конечно, это зависит от того, как представлены ваши интервалы и какой критерий вы используете для подразделения.

Другие вопросы по тегам