我正在尝试用推力排序GPU上的结构数组::sort。但是,当我使用nvcc进行编译时,会收到以下警告:
ptxas /tmp/tmpxft_00005186_00000000-5_antsim.ptx,第1520行;警告:不支持Double。降为浮动
我已经把这个问题隔离到了我的推力::排序,在这里:
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;
}
};在我看来,这似乎没有任何双倍,尽管我怀疑,在我的函子中小于运算符的评估这些浮标为双倍。我可以通过使用-arch sm_13进行编译来解决这个问题,但我很好奇为什么这会首先向我抱怨。
发布于 2014-02-03 07:19:10
之所以会出现降级,是因为CUDA设备最初支持双精度计算,计算能力为1.3。NVCC知道规格,并且因为硬件不能处理双精度而降低CC < 1.3设备的每一倍浮动。
在维基百科上可以找到一个很好的特性列表:库达
在这段代码中看不到任何双倍并不意味着它们不存在。最常见的错误是浮点常量上缺少的f后缀。编译器执行从所有浮点数到双倍的隐式强制转换,当一个double是表达式的一部分时。没有f的浮点常量是一个双值,并且开始转换。但是,对于较少的运算符,不应该发生没有常量表达式的强制转换.
我只能推测,但在您的情况下,可以在要旨::sort实现中使用双精度值。因为您只向高阶函数(以函数作为参数的函数)提供用户函数。
https://stackoverflow.com/questions/21520757
复制相似问题