我试图找到数组中的最小元素:
thrust::device_ptr<float> devPtr(d_ary);
int minPos = thrust::min_element(devPtr.begin(), devPtr.end()) - devPtr.begin();
编译时出现上述错误。
我应该如何解决这个问题?谢谢
您确定的具体错误是因为设备指针不是容器,因此没有.begin()
or.end()
成员。yourdevPtr
不是容器,它是 Thrust 可以使用的设备指针。您包装了一个原始指针来创建 devPtr,而原始指针不知道它所指向的数据区域的大小。
指针没有像 begin 和 end 这样的成员。
您可以通过以下方式解决问题:
下面是一些示例代码,类似于上面的后一个想法:
#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 调用是一种很好的做法。)