假设我有以下函数:
__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.);
这将使用正确的双精度版本。