如何使用 Thrust 从 int2 数组计算平均值

Posted

技术标签:

【中文标题】如何使用 Thrust 从 int2 数组计算平均值【英文标题】:how to calculate an average from a int2 array using Thrust 【发布时间】:2012-03-10 23:43:46 【问题描述】:

我正在尝试计算包含点 (x,y) 的某个数组的平均值。 是否可以使用推力来找到表示为 (x,y) 点的平均点? 我也可以将数组表示为thrust::device_vector<int>当每个单元格包含点的绝对位置时,这意味着i*numColumns + j 虽然我不确定平均数是否代表平均单元格。 谢谢!

【问题讨论】:

你不能只计算为int2 类型定义一个加法运算符(即a+b=a.x+b.x,a.y+b.y),然后使用标准归约计算输入的总和,然后除以元素数? 如果您使用 Thrust 1.5+ 的 lambda 占位符,则可以使用运算符(请参阅下面的附加答案)。 【参考方案1】:
#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/reduce.h>

struct add_int2 
  __device__
  int2 operator()(const int2& a, const int2& b) const 
    int2 r;
    r.x = a.x + b.x;
    r.y = a.y + b.y;
    return r;
  
;

#define N 20

int main()

  thrust::host_vector<int2> a(N);
  for (unsigned i=0; i<N; ++i) 
    a[i].x = i;
    a[i].y = i+1;
  

  thrust::device_vector<int2> b = a;

  int2 init;
  init.x = init.y = 0;

  int2 ave = thrust::reduce(b.begin(), b.end(), init, add_int2());
  ave.x /= N;
  ave.y /= N;

  std::cout << ave.x << " " << ave.y << std::endl;
  return 0;

【讨论】:

【参考方案2】:

Keveman 的回答是正确的,我只是想添加一个需要代码的有用提示,所以我将它放在这里而不是在 cmets 中。

Thrust 1.5 添加了 lambda 占位符,这可以使 @keveman 的方法更加简单。而不是函子,只需为int2 定义operator+,然后用_1 + _2 lambda 占位符表达式替换函子的实例化。您还可以将 init 的显式声明替换为对 make_int2() 的调用(由 CUDA 提供)。注意:int2 operator+ 是在 CUDA 代码示例 SDK 的“vector_math.h”头文件中定义的,但我在下面定义它以使其清楚(因为该文件不是 CUDA 的标准部分)。

#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/reduce.h>

using namespace thrust::placeholders;

__device__
int2 operator+(const int2& a, const int2& b) 
  return make_int2(a.x+b.x, a.y+b.y);


#define N 20

int main()

  thrust::host_vector<int2> a(N);
  for (unsigned i=0; i<N; ++i) 
    a[i].x = i;
    a[i].y = i+1;
  

  thrust::device_vector<int2> b = a;

  int2 ave = thrust::reduce(b.begin(), b.end(), make_int2(0, 0), _1 + _2);
  ave.x /= N;
  ave.y /= N;

  std::cout << ave.x << " " << ave.y << std::endl;
  return 0;

【讨论】:

以上是关于如何使用 Thrust 从 int2 数组计算平均值的主要内容,如果未能解决你的问题,请参考以下文章

如何从对象数组中获得平均值

根据测试中的类平均值从数组 C# 输出平均值

如何计算无符号字符数组中元素的平均值?

如何使用 Thrust 库以较低的精度对键进行排序

如何计算数组中元素的总和和平均值?

Java:如何从第二种方法获取变量以在第三种方法中工作?