0

C++ で VexCL を使用して、特定の最小値を超えるベクトル内のすべての値をカウントしようとしています。このカウントをデバイスで実行したいと考えています。デフォルトのリダクターは、MIN、MAX、および SUM のメソッドのみを提供します。例では、そのような操作を実行する方法が明確に示されていません。このコードは、おそらくデバイスではなくホストで実行されるため、低速です。

int amount = 0;
int minimum = 5;

for (vex::vector<int>::iterator i = vector.begin(); i != vector.end(); ++i)
{
    if (*i >= minimum)
    {
        amount++;
    }
}

私が使用しているベクトルは、大量の値、たとえば数百万とほとんどゼロで構成されます。最小値を超える値の量に加えて、これらの値を含むベクター ID のリストも取得したいと考えています。これは可能ですか?

4

2 に答える 2

1

最小値を超える要素のみをカウントする必要がある場合、これは次のように簡単です

vex::Reductor<int, vex::SUM> sum(ctx);
int amount = sum( vec >= minimum );

このvec >= minimum式は一連の 1 と 0 になりsum、1 をカウントします。

ここで、最小値より上の要素の位置も取得する必要があるため、もう少し複雑になります。

#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
}
于 2014-09-07T04:11:04.177 に答える