gpt4 book ai didi

c++ - VexCL: vexcl vector 中最大值的索引

转载 作者:行者123 更新时间:2023-11-28 02:45:10 35 4
gpt4 key购买 nike

如何找到 VexCL vector 中最大值的索引?我可以找到最大值:

int h[] = {3, 2, 1, 5, 4};
vex::vector<int> d(ctx, 5);
vex::copy(h, d);

vex::Reductor<int, vex::MAX> max(ctx.queue());
int m = max(d);

这给出了 m = 5 但有没有办法找到最大值的索引 ind = 3

最佳答案

你需要

  1. 在 vexcl 表达式中对 vector 值和 vector 位置进行编码,并且
  2. 为 vex::Reductor 创建自定义仿函数,它将根据其第一个组件减少上述表达式。

这是工作代码:

#include <iostream>
#include <vector>
#include <vexcl/vexcl.hpp>

// This function converts two integers to cl_int2
VEX_FUNCTION(cl_int2, make_int2, (int, x)(int, y),
int2 v = {x, y};
return v;
);

// This struct compares OpenCL vector types by the first component.
struct MAX0 {
template <class Tn>
struct impl {
typedef typename vex::cl_scalar_of<Tn>::type T;

// Initial value.
static Tn initial() {
Tn v;

if (std::is_unsigned<T>::value)
v.s[0] = static_cast<T>(0);
else
v.s[0] = -std::numeric_limits<T>::max();

return v;
}

// Device-side function call operator
struct device : vex::UserFunction<device, Tn(Tn, Tn)> {
static std::string name() { return "MAX_" + vex::type_name<Tn>(); }
static std::string body() { return "return prm1.x > prm2.x ? prm1 : prm2;"; }
};

// Host-side function call operator
Tn operator()(Tn a, Tn b) const {
return a.s[0] > b.s[0] ? a : b;
}
};
};

int main(int argc, char *argv[]) {
vex::Context ctx( vex::Filter::Env );

std::vector<int> h = {3, 2, 1, 5, 4};
vex::vector<int> d(ctx, h);

// Create reductor based on MAX0 operation,
// then reduce an expression that encodes both value and position of a
// vector element:
vex::Reductor<cl_int2, MAX0> max(ctx);

cl_int2 m = max(make_int2(d, vex::element_index()));

std::cout << "max value of " << m.s[0] << " at position " << m.s[1] << std::endl;
}

这输出

max value of 5 at position 3

关于c++ - VexCL: vexcl vector 中最大值的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24673624/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com