首页 > 解决方案 > CUDA 内核和数学函数的显式命名空间

问题描述

我正在做一个项目,其中有多个基本数学函数(cos、sin、exp、log、sqrt、...)的定义为各种对象重载。我包含多个具有此类定义的标题(例如<cmath><cuda.h>和我自己的标题)并不少见。为了完全确定使用了正确的实现,我想明确写出命名空间,例如std::sqrt(). 这让我想知道两个相关的事情:

问:如何确保我使用<cuda.h>了特定函数的实现,即是否可以显式写出命名空间?

问:我是否会std::sqrt()在使用 CUDA 内核时遇到问题(比如性能问题,因为它通常是主机功能)?

标签: c++cuda

解决方案


在 cuda 内核中,您只能使用具有__device__属性的函数。这保证了不会使用std::cmath不会使用任何内容。

error: calling a constexpr __host__ function("sqrt") from a __global__ function("kernel") is not allowed. The experimental flag '--expt-relaxed-constexpr' can be used to allow this.

推荐阅读