微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算具有推力的设备阵列的减少和

如何解决计算具有推力的设备阵列的减少和

我知道我们可以用这样的推力计算 cpu(主机)阵列的总和。

int data[6] = {1,2,1,3};
int result = thrust::reduce(data,data + 6,0);

我们可以在没有 cudamemcpycpu 阵列的情况下找到具有推力的 GPU 阵列的总和吗?
假设我有一个使用 cudamalloc 创建的设备数组,

cudamalloc(&gpuspeed,n* sizeof(int));  

并使用一些内核对 gpuspeed 进行了修改。现在我可以用推力找到它的总和吗?如果可以,我必须做出哪些改变?

解决方法

是的,你可以用推力做到这一点。

您可以将设备指针传递给推力,如果您使用推力执行策略明确指定设备执行路径,推力会做正确的事情。

或者,您可以使用 thrust::device_ptr 来引用您的数据,即使没有明确指定设备执行路径,推力也会做正确的事情。

This answer 涵盖了这两种方法,尽管使用了 inclusive_scan

这是一个例子:

$ cat t137.cu
#include <thrust/reduce.h>
#include <thrust/device_ptr.h>
#include <thrust/execution_policy.h>
#include <iostream>

__global__ void k(int *d,int n){
  int idx = threadIdx.x+blockDim.x*blockIdx.x;
  if (idx < n)
    d[idx] = idx;
}
const int ds = 10;
const int nTPB = 256;
int main(){

  int *d,r1,r2;
  cudaMalloc(&d,ds*sizeof(d[0]));
  k<<<(ds+nTPB-1)/nTPB,nTPB>>>(d,ds);
  thrust::device_ptr<int> tdp = thrust::device_pointer_cast(d);
  r1 = thrust::reduce(tdp,tdp+ds);
  r2 = thrust::reduce(thrust::device,d,d+ds);
  std::cout << "r1: "  << r1 << " r2: " << r2 << std::endl;
}
$ nvcc -std=c++14 -o t137 t137.cu
$ ./t137
r1: 45 r2: 45
$

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。