thrust :: device_ptr <float>没有成员'begin'</float>

时间:2012-10-10 13:50:07

标签: cuda thrust

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

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

编译时我遇到了上述错误。

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

1 个答案:

答案 0 :(得分:3)

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

指针没有像开始和结束的成员。

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

  1. 切换到使用推力向量容器,它将为你定义.begin和.end迭代器
  2. 为您正在访问的数据区域(d_ary)手动创建开始和结束指针
  3. 以下是一些示例代码,与上一个概念相符:

    #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);
    }
    

    有一个thrust quickstart guide可能会引起关注。 (为了清楚起见,我没有用任何错误检查包装cudaMalloc调用。最好用错误检查来包装cuda调用。)