首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ptxas“不支持双”警告时使用推力::排序对一个结构数组

ptxas“不支持双”警告时使用推力::排序对一个结构数组
EN

Stack Overflow用户
提问于 2014-02-03 06:05:51
回答 1查看 308关注 0票数 0

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

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

我已经把这个问题隔离到了我的推力::排序,在这里:

代码语言:javascript
复制
thrust::sort(thrustAnts, thrustAnts + NUM_ANTS, antSortByX());

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

代码语言:javascript
复制
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进行编译来解决这个问题,但我很好奇为什么这会首先向我抱怨。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-03 07:19:10

之所以会出现降级,是因为CUDA设备最初支持双精度计算,计算能力为1.3。NVCC知道规格,并且因为硬件不能处理双精度而降低CC < 1.3设备的每一倍浮动。

在维基百科上可以找到一个很好的特性列表:库达

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

我只能推测,但在您的情况下,可以在要旨::sort实现中使用双精度值。因为您只向高阶函数(以函数作为参数的函数)提供用户函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21520757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档