【问题标题】:logical shift in CUDACUDA 中的逻辑转换
【发布时间】:2011-05-26 16:05:36
【问题描述】:
rshift = ((J[i]-1)*((2*net)-J[i]) >> -1);

L[i] = rshift + K[i]-J[i];

当我编译这个时,我得到与第一行对应的“错误:表达式必须具有整数或枚举类型”。除了 'i' 都具有双精度。

它既不适合左移也不适合右移。我正在使用 Fedora 12,并且我有 nvcc 3.2,V0.2.1221。对于 c++(g++ 编译器),它可以完美运行。

但是当我尝试它时

rshift = ((J[i]-1)*((2*net)-J[i]) >>= -1);

L[i] = rshift + K[i]-J[i];

这是“错误:表达式必须是可修改的左值”我尝试了很多但无法修复它。有什么想法吗?

【问题讨论】:

  • 我不确定我是否遵循。您希望通过对双精度浮点值执行移位来实现什么?
  • a>>=b 是 a=a>>b 的简写;您试图将值写入不是左值(不是可修改实体)的表达式
  • 基本上我正在尝试将 fortran 程序转换为 cuda。 @talonmies 所以你认为我应该改变 rshift 的定义。 @osgx thanx,我只是在学习逻辑转换。
  • @Population Xplosive:Fortran 也没有浮点数的移位操作。所以无论你在翻译什么,你都误解了一些东西。
  • @Population Xplosive:对。 ISHFT 是整数位移位。默认情况下,在 Fortran 77 或更早版本中,名称以 I、J、K、L、M 或 N 开头的变量是隐式整数。所有的数值常数也是整数。如果代码 sn-p 执行的不是整数位移,我会感到非常惊讶。

标签: cuda bit-shift shift


【解决方案1】:

回答这个问题 - CUDA C(也不是 C,也不是 C++)中没有浮点类型的位移。通过 cmets 中发布的问题,混淆的根源似乎是不正确地尝试翻译一些不支持浮点位移位的遗留 Fortran 代码。

【讨论】:

  • 谢谢。我将 (J[i]-1)*((2*net)-J[i]) 转换为整数并尝试移位。现在它工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-04
  • 2019-10-29
  • 2017-04-01
相关资源
最近更新 更多