如果你只需要數高於最低元素,這將是一樣簡單
vex::Reductor<int, vex::SUM> sum(ctx);
int amount = sum(vec >= minimum);
1和0的序列vec >= minimum
表達的結果,sum
然後計算的。現在
,因爲你還需要得到最低限度以上元素的位置,它變得有點複雜:
#include <iostream>
#include <vexcl/vexcl.hpp>
int main() {
vex::Context ctx(vex::Filter::Env && vex::Filter::Count(1));
// Input vector
vex::vector<int> vec(ctx, {1, 3, 5, 2, 6, 8, 0, 2, 4, 7});
int n = vec.size();
int minimum = 5;
// Put result of (vec >= minimum) into key, and element indices into pos:
vex::vector<int> key(ctx, n);
vex::vector<int> pos(ctx, n);
key = (vec >= minimum);
pos = vex::element_index();
// Get number of interesting elements in vec.
vex::Reductor<int, vex::SUM> sum(ctx);
int amount = sum(key);
// Sort pos by key in descending order.
vex::sort_by_key(key, pos, vex::greater<int>());
// First 'amount' of elements in pos now hold indices of interesting
// elements. Lets use slicer to extract them:
vex::vector<int> indices(ctx, amount);
vex::slicer<1> slice(vex::extents[n]);
indices = slice[vex::range(0, amount)](pos);
std::cout << "indices: " << indices << std::endl;
}
這給出了以下的輸出:
indices: {
0: 2 4 5 9
}
我不知道關於VexCL,但在主機端,你應該使用['count_if'](http://en.cppreference.com/w/cpp/algorithm/count)而不是自己循環。 VexCL沒有類似的東西? – 2014-09-05 11:06:03