改善结果装置中的数学函数(CUDA)

改善结果装置中的数学函数(CUDA),cuda,Cuda,为了提高代码的执行时间,是否值得在deviceGPU中执行数学函数pow 我从Cuda工具包文档中找到了函数_powf: 因此,我将pow函数调用替换为uu powf,并在编译器中使用选项-use_fast_math,但我得到的结果是nan,而不是双精度数字。为了实现上述目标,我应该对代码进行哪些更改 my code.cu的库: my code.cu的一部分: 你使用pow来平方数字,这是非常低效的。将乘法与内联函数一起使用: static inline double square(doubl

为了提高代码的执行时间,是否值得在deviceGPU中执行数学函数pow

我从Cuda工具包文档中找到了函数_powf:

因此,我将pow函数调用替换为uu powf,并在编译器中使用选项-use_fast_math,但我得到的结果是nan,而不是双精度数字。为了实现上述目标,我应该对代码进行哪些更改

my code.cu的库:

my code.cu的一部分:

你使用pow来平方数字,这是非常低效的。将乘法与内联函数一起使用:

static inline double square(double x) { return x * x; }
double hypot(double x, double y);
您可能会得到NaN值,因为传递给pow的数字是负数。这应该不是问题,但cuda对pow或_powf的实施可能不支持这一点

还请注意,可以使用hypop函数更直接地计算两点之间的欧几里德距离:

static inline double square(double x) { return x * x; }
double hypot(double x, double y);

最后,正如Weather Vane所强调的,如果您感兴趣的只是与另一个以相同方式计算的距离进行比较,则可能不需要取平方根。

此外,如果您只是比较距离,例如排序或深度缓冲,则不必取平方根。@Weather Vane:我对此毫无疑问;-,我发表了评论。想分享一下期望的数字和获得这些数字的输入吗?这比仅仅说明它不起作用要容易得多。@tera:我同意你的看法,wasilis应该提供结果为NaN的数值,我怀疑uu powf在负数上失败了,正如文档上的注释所说,它是从exp2fy*u log2fx的实现中派生出来的。。。但是,使用POW可能根本不需要。如注释CCHRLIY所指出的:将传播考虑到答案本身中,γ-PUFFX,Y只是Exp2Fy×SyLog2FX的速记。CUDA math Intrinsic的功能旨在与Cg中的相应功能相匹配__因此,powf不处理C/C++为pow和powf定义的许多特殊情况。此外,将双精度数据传递给单精度函数这一简单事实也可能导致问题,即溢出和下溢的危险。还可以比较《CUDA最佳实践指南》第11.1.4节和第11.1.5节。-你已经问过一次这个问题了……我今天编辑了这个问题,但是我看到了[closed]标签,我认为最好再次上传这个问题。对于这种类型的问题,为什么这个代码不起作用?你应该证明你提供的不是,如果你不确定为什么不是,请点击链接并开始阅读。此代码不完整。@wasilis::请单击分数下面的灰色复选标记接受答案,好吗?