在CUDA中使用thrust :: sort时出现分段错误

时间:2014-12-30 14:06:40

标签: cuda parallel-processing thrust

我试图通过将比较函数作为参数传递给推力排序,根据类型对类对象进行排序。

类定义

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

中提到了示例

2 个答案:

答案 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代码路径。