当前位置: 首页 > 知识库问答 >
问题:

CUDA中的浮动(0.0)与0.0f

云季同
2023-03-14

我想编写对浮点和双精度都有效的代码。我正在做这样的事情:

typedef real float;
//typedef real double;

__global__ void foo(real a, real *b){
  b[0] = real(0.5)*a;
}

int main(){
  real a = 1.0f;
  real *b;
  cudaMalloc(&f, sizeof(real));
  foo<<<1,1>>>(a,b);
  return 0;
}

这让我想到,我不想在做双精度时,在常数为0.5f时失去精度,但是我不想在做单精度时,将0.5提升到双精度!

因此,我最终使用了操作符real(),如示例中所示。在单精度模式下,如果我使用real(0.5)反汇编函数“foo”,我得到的结果是,没有提升到double,而不是只使用0.5,提升发生在那里。

您可以检查使用:

$nvcc test.cu -arch=sm_52 -lineinfo --source-in-ptx -g -G -O0 ; cuobjdump -sass  a.out | grep "foo" -A 35

我懂了

/*0078*/                   FMUL R0, R0, 0.5;               /* 0x3868004000070000 */

使用实数(0.5)或0.5f时,以及:

/*0078*/                   F2F.F64.F32 R4, R0;           /* 0x5ca8000000070b04 */
/*0088*/                   DMUL R4, R4, 0.5;               /* 0x3880004000070404 */
/*0090*/                   F2F.F32.F64 R0, R4;           /* 0x5ca8000000470e00 */

当只写0.5的时候。

这听起来可能太明显了。但是,由于我不知道什么是“real(0.5)”在做什么,我不知道这是否只是编译器在这个非常特殊的情况下进行的操作。反汇编后的代码在real(0.5)和0.5f中似乎是相同的!

因此,问题仍然是:

real(0.5)(又称float(0.5))到底在做什么?

浮点数(0.5)和0.5f有什么区别吗?(OR双(0.5)和0.5)

我想这也适用于C/C。

共有1个答案

穆宾白
2023-03-14

real(0.5)function-style-cast,在这种情况下,它会降低到static\u-cast

real(0.5)
static_cast<real>(0.5) //exactly the same thing

这意味着areal变量相乘(在本例中为float),这意味着不需要像double*float乘法那样执行升级到double

有人可能会争辩说,初始化0.5浮动可能发生在运行时,但这对于任何现代编译器来说都是不现实的。这应该是一个不行动,它已经是行动了。

除此之外,使用浮动(0.5f)与仅仅使用0.5f没有任何区别,同样适用于双(0.5)0.5

 类似资料:
  • 在我的代码中, 与负零相比 结果将为true。 但是 与负零相比 此外,结果将为true,而不是false 为什么这两种情况的结果都是真的? 这里有一个MCVE来测试它(在coliru上直播): 输出:

  • CUDA 工具包是一种针对支持CUDA功能的GPU(图形处理器)的C语言开发环境。CUDA 开发环境包括: nvcc C语言编译器 适用于GPU(图形处理器)的CUDA FFT和BLAS库 分析器 适用于GPU(图形处理器)的gdb调试器(在2008年3月推出alpha版) CUDA运行时(CUDA runtime)驱动程序(目前在标准的NVIDIA GPU驱动中也提供) CUDA编程手册 CUD

  • 问题内容: 假设我们有一个非常简单的场景 这是样式: 事情是…当我向其中添加内容时,应该拉下父div,我们需要看到红色背景…问题是,我看不到红色背景充满了所有高度。 问题答案: 当子元素浮动时,它们将从文档流中删除。这样做时,父级将不再具有定义的尺寸,因为子级在技术上不会占用空间。因此,父元素自身折叠。当绝对定位子元素时,也会发生相同的情况。 在这种情况下,我们可以通过添加到父元素来修复它,从而强

  • 问题内容: 假设您有一个,给它一个定值,然后在其中添加元素,在我的情况下为另一个。 这个想法是容器的内容将导致容器伸展,并成为内容的背景。但是,当我这样做时,包含的对象会缩小以适合非漂浮的对象,并且漂浮的对象将要么全部伸出,要么一半伸出,一半进入,并且对big的大小没有任何影响。 为什么是这样?有什么我想念的东西,怎么才能让漂浮的物品伸出其中的东西呢? 问题答案: 最简单的方法是放在父div上,而

  • 主要内容:清除浮动浮动可以使一个元素脱离自己原本的位置,并在父元素的内容区中向左或向右移动,直到碰到父元素内容区的边界或者其它浮动元素为止。另外,在浮动元素之后定义的文本或者行内元素都将环绕在浮动元素的一侧,从而可以实现文字环绕的效果,类似于 Word 中图文混排。 注意:浮动(float)属性仅对非绝对定位的元素有效,跟随浮动元素的文本或行内元素将围绕在浮动元素的另一侧,例如向左浮动的话其它元素将围绕在浮动元素的

  • 本文最初发表于博客园,并在GitHub上持续更新。以下是正文。 文本主要内容 标准文档流 标准文档流的特性 行内元素和块级元素 行内元素和块级元素的相互转换 浮动的性质 浮动的清除 浏览器的兼容性问题 浮动中margin相关 关于margin的IE6兼容问题 标准文档流 宏观地讲,我们的web页面和photoshop等设计软件有本质的区别:web页面的制作,是个“流”,必须从上而下,像“织毛衣”。