c++ - VexCL:计算 vector 中高于最小值的值的数量

标签 c++ vector count vexcl

在 C++ 中使用 VexCL 我试图计算一个 vector 中高于某个最小值的所有值,我想在设备上执行此计数。默认的 Reductors 只提供 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++;
    }
}

我正在使用的 vector 将包含大量值,比如数百万,而且大部分为零。除了高于最小值的数量之外,我还想检索包含这些值的 vector ID 列表。这可能吗?

最佳答案

如果你只需要计算最小值以上的元素,这会很简单

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
}

关于c++ - VexCL:计算 vector 中高于最小值的值的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25684280/

相关文章:

c++ - 阻塞模式的原理是什么?

c++ - 哪个值更好用? boolean 真还是整数 1?

arrays - 将 Vector.<SomeType> 转换为数组?

C++ Vector at/[] 运算符速度

mysql - 在 MySql 中查找所选项目数量的最快方法?

elasticsearch - 按最后一分钟和事件级别获取事件计数

c++ - 有什么建议可以精确地制作以下 c++ 代码吗?

c++ - libiconv - iconv_open() 默认行为?

c++如何使两个 vector 一个带有数据另一个指向并且只读

SQL 计算连接表上的唯一真值