Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA固有功能优势_Cuda - Fatal编程技术网

CUDA固有功能优势

CUDA固有功能优势,cuda,Cuda,与之类似,在CUDA Math API中使用内部函数(单、双或半)是否有任何优势。我知道有些版本更快(精度较低),如\uu fdivdef,并且这些版本始终可以与一起使用-使用\u fast\u math,但是其他功能如何。例如,为什么要使用\u fadd\u rd(A,B)而不是A+B或\u fmaf\u rd(A,B,C)而不是A+B+C?我能想到的一个原因是,人们可以更方便地选择舍入法——很好 此外,一些函数,例如\uu fmul\u rd“永远不会合并到单个乘法加法指令中”(根据CUDA

与之类似,在CUDA Math API中使用内部函数(单、双或半)是否有任何优势。我知道有些版本更快(精度较低),如
\uu fdivdef
,并且这些版本始终可以与
一起使用-使用\u fast\u math
,但是其他功能如何。例如,为什么要使用
\u fadd\u rd(A,B)
而不是
A+B
\u fmaf\u rd(A,B,C)
而不是
A+B+C
?我能想到的一个原因是,人们可以更方便地选择舍入法——很好


此外,一些函数,例如
\uu fmul\u rd
“永远不会合并到单个乘法加法指令中”(根据CUDA Math API文档)。为什么这是有利的?

真正简短的答案是,使用类似于
\uu fmul\u rd
的东西从来都不是“有利的”,但有时使用具有明确定义和完全可预测(或标准化)的舍入和编译行为的浮点指令,以使计算正常工作,比如说


一般的规则是,如果你不理解这些浮点内在函数存在的原因,你就不应该使用它们。

真正简单的答案是,使用像
\uu fmul\u rd
这样的东西从来都不是“有利的”,但有时使用定义明确且完全可预测(或标准化)的浮点指令为了使计算正确进行,需要舍入和编译行为,比如说


一般的规则是,如果您不理解这些浮点内在函数存在的原因,就不应该使用它们。

内在函数可以更好地控制内部循环将要执行的操作。如果我调用
\uuu fmaf\u rd
,我几乎可以确定发出的PTX将具有
fma.rd
指令,而无需编写内联汇编代码

因此,我不会担心编译器可能会以不同于我想要的方式优化循环*,也不会担心我忽略的标准可能有一些微妙之处,需要编译器实现比我想象的更复杂的东西

当然,这只是一个很好的动机,如果我真的知道我在这方面做什么,但如果我知道,它是我可以使用的。作为一个内在的编译器要优于内联汇编,因为编译器实际上理解指令


*:当您知道实现循环的最佳方法时,您无法理解这是多么令人沮丧,但编译器会不断地“优化”到效率较低的某个方面。

内部函数可以让您更好地控制内部循环将要执行的操作。如果我调用
\uuu fmaf\u rd
,我几乎可以确定发出的PTX将具有
fma.rd
指令,而无需编写内联汇编代码

因此,我不会担心编译器可能会以不同于我想要的方式优化循环*,也不会担心我忽略的标准可能有一些微妙之处,需要编译器实现比我想象的更复杂的东西

当然,这只是一个很好的动机,如果我真的知道我在这方面做什么,但如果我知道,它是我可以使用的。作为一个内在的编译器要优于内联汇编,因为编译器实际上理解指令


*:当您知道实现循环的最佳方法时,您无法理解这是多么令人沮丧,但编译器会不断“优化”到效率较低的地方

当不使用内在函数时,CUDA的默认舍入模式是否与GCC相同?当不使用内在函数时,CUDA的默认舍入模式是否与GCC的舍入模式一样最接近?通常相反。您需要使用内部函数来防止编译器执行优化,例如将乘法和加法运算融合到FMAD中,以及更改给定浮点计算的舍入行为。通常情况下,相反的情况是正确的。您需要使用内部函数来防止编译器执行优化,如将乘法和加法运算融合到FMAD中,以及更改给定浮点计算的舍入行为。