在结构数组上使用thrust :: sort时,ptxas“不支持double”警告

时间:2014-02-03 06:05:51

标签: c++ c cuda thrust

我正在尝试使用thrust :: sort对GPU上的结构数组进行排序。但是,当我使用nvcc编译时,我收到此警告:

ptxas /tmp/tmpxft_00005186_00000000-5_antsim.ptx,第1520行;警告:不支持Double。降级为漂浮

我把问题隔离到我对push :: sort的调用,在这里:

thrust::sort(thrustAnts, thrustAnts + NUM_ANTS, antSortByX());

thrustAnts是位于GPU上的Ant结构数组,而antSortByX是一个如下定义的仿函数:

typedef struct {
   float posX;
   float posY;
   float direction;
   float speed;
   u_char life;
   u_char carrying;
   curandState rngState;
} Ant;

struct antSortByX {
   __host__ __device__ bool operator()(Ant &antOne, Ant &antTwo) {
      return antOne.posX < antTwo.posX;
   }
};

在我看来好像没有任何双打,虽然我很怀疑我的仿函数中的less-than运算符将这些浮点数评估为双精度。我可以通过-arch sm_13进行编译来解决这个问题,但我很好奇为什么这首先是抱怨我。

1 个答案:

答案 0 :(得分:1)

降级的发生是因为CUDA设备首先支持双精度计算,计算能力为1.3。对于CC <1的设备,NVCC知道规格并降低每两倍的浮动。 1.3只是因为硬件无法处理双精度。

可以在维基百科上找到一个好的功能列表:CUDA

你在这段代码中看不到任何双打并不意味着它们不存在。最常见的是,此错误是由浮点常量上的f后缀丢失引起的。当一个double是表达式的一部分时,编译器性能从所有浮点数隐式转换为double。没有f的浮点常量是一个double值,并且转换开始。但是,对于较少的运算符,不应该发生没有常量表达式的强制转换。

我只能推测,但在我看来,在您的情况下,可以在thrust :: sort实现中使用双精度值。由于您只为高阶函数提供用户函数(将函数作为参数的函数)。