我试图通过将比较函数作为参数传递给推力排序,根据类型对类对象进行排序。
类定义:
class TetraCutInfo
{
public:
int tetraid;
unsigned int ncutEdges;
unsigned int ncutNodes;
unsigned int type_cut;
__host__ __device__ TetraCutInfo();
};
类别:
thrust::sort(cutInfoptr,cutInfoptr+n,cmp());
cutInfoptr是TetraCutInfo类型的指针,具有使用cudaMalloc分配的设备内存的地址。
比较功能
struct cmp
{
__host__ __device__
bool operator()(const TetraCutInfo x, TetraCutInfo y)
{
return (x.type_cut < y.type_cut);
}
};
运行此操作时,我收到Segmentation错误,但是我可以在另一个内核中迭代cutInfoptr。
PS:我在链接https://code.google.com/p/thrust/source/browse/examples/sort.cu
中提到了示例答案 0 :(得分:4)
cutInfoptr是TetraCutInfo类型的指针,具有使用cudaMalloc分配的设备内存的地址。
虽然您没有显示完整的代码,但基于您上面的陈述,事情可能无法正常工作,并且我会发现一个seg错误,因为该指针被取消引用。
请注意thrust quick start guide中提供的信息:
你可能想知道当&#34; raw&#34;指针用作Thrust函数的参数。与STL一样,Thrust允许这种用法,它将调度算法的主机路径。如果有问题的指针实际上是指向设备内存的指针,那么在调用函数之前,你需要用thrust :: device_ptr来包装它。
如果由cutInfoptr
创建,则您引用的cudaMalloc
是&#34;原始指针&#34; (它也恰好是设备指针)。当你将它传递给推力时,推力看到它是一个原始指针,并发送&#34;主机路径&#34;。当您传递的(设备)指针在主机路径中的主机代码中取消引用时,会出现seg错误。
解决方法是将它包装在thrust :: device_ptr指针中,摘录快速入门指南示例:
size_t N = 10;
// raw pointer to device memory
int * raw_ptr;
cudaMalloc((void **) &raw_ptr, N * sizeof(int));
// wrap raw pointer with a device_ptr
thrust::device_ptr<int> dev_ptr(raw_ptr);
// use device_ptr in thrust algorithms
thrust::fill(dev_ptr, dev_ptr + N, (int) 0);
答案 1 :(得分:0)
Segfaults更可能是由主机代码引起的,我建议先检查CPU代码路径。