如何说服CMake使用CUDA fmax函数而不是std cmath函数



假设我有以下函数:

__global__ void testFunction(double *a, double *b) {
unsigned int index = blockIdx.x * blockDim.x + threadIdx.x;
a[index] = fmax(b[index], 0.0f);
}

然后构建给出错误:

错误:不允许从__global__函数("testFunction"(调用constexpr __host__函数(&"fmax"(。实验标志"--expt-related constexpr"可用于允许此操作。

这显然意味着我不能使用函数fmax,它是在std库cmath中定义的。然而,它也被定义为CUDA设备功能,这是我最初想要使用的功能。

因此,问题是:如何告诉CMake(或任何编译器,如果可以的话(使用fmax的CUDA __device__定义,而不是std cmath版本?

注意:我是而不是,在此代码中使用using namespace std;和/或#include < cmath>

CMakeLists.txt:

cmake_minimum_required(VERSION 3.17)
project(NAME CUDA)
set(CMAKE_CUDA_STANDARD 14)
add_executable(NAME main.cu /*some other files*/)
set_target_properties(
NAME
PROPERTIES
CUDA_SEPARABLE_COMPILATION ON)

问题与CMake或链接无关。

CUDA使用模板重载在设备代码中提供本机数学库函数。根据文档,正好提供了fmax的两个版本(此处和此处(。它们是

float fmax(float, float)
double fmax(double double)

您的代码正在请求

double fmax(double, float)

因为CCD_ 4是单精度常数。没有本地重载,因此它通过CUDA工具链前端,编译器最终得出结论,您需要一个主机函数,从而导致错误。

正确的代码应该是

a[index] = fmax(b[index], 0.);

这将使用正确的双精度版本。

最新更新