2

我试图找到数组中的最小元素:

 thrust::device_ptr<float> devPtr(d_ary);
 int minPos = thrust::min_element(devPtr.begin(), devPtr.end()) - devPtr.begin();

编译时出现上述错误。

我应该如何解决这个问题?谢谢

4

1 回答 1

3

您确定的具体错误是因为设备指针不是容器,因此没有.begin()or.end()成员。yourdevPtr不是容器,它是 Thrust 可以使用的设备指针。您包装了一个原始指针来创建 devPtr,而原始指针不知道它所指向的数据区域的大小。

指针没有像 begin 和 end 这样的成员。

您可以通过以下方式解决问题:

  1. 切换到使用推力向量容器,该容器将为您定义 .begin 和 .end 迭代器
  2. 为您正在访问的数据区域 (d_ary) 手动创建开始和结束指针

下面是一些示例代码,类似于上面的后一个想法:

#include <thrust/device_ptr.h>
#include <thrust/extrema.h>

#define N 256
int main()
{

  float *d_a;

  cudaMalloc((void **) &d_a, N*sizeof(float));

  thrust::device_ptr<float> dPbeg(d_a);
  thrust::device_ptr<float> dPend = dPbeg + N;
  thrust::device_ptr<float> result = thrust::min_element(dPbeg, dPend);
}

有一个可能感兴趣的推力快速入门指南。(为了清楚起见,我没有用任何错误检查包装 cudaMalloc 调用。用错误检查包装 cuda 调用是一种很好的做法。)

于 2012-10-10T14:28:19.217 回答