我正在尝试使用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进行编译来解决这个问题,但我很好奇为什么这首先是抱怨我。
答案 0 :(得分:1)
降级的发生是因为CUDA设备首先支持双精度计算,计算能力为1.3。对于CC <1的设备,NVCC知道规格并降低每两倍的浮动。 1.3只是因为硬件无法处理双精度。
可以在维基百科上找到一个好的功能列表:CUDA
你在这段代码中看不到任何双打并不意味着它们不存在。最常见的是,此错误是由浮点常量上的f
后缀丢失引起的。当一个double是表达式的一部分时,编译器性能从所有浮点数隐式转换为double。没有f
的浮点常量是一个double值,并且转换开始。但是,对于较少的运算符,不应该发生没有常量表达式的强制转换。
我只能推测,但在我看来,在您的情况下,可以在thrust :: sort实现中使用双精度值。由于您只为高阶函数提供用户函数(将函数作为参数的函数)。