我正在编写大量内存的CUDA计算程序。我需要使用数学函数,例如内核中math.h中的函数。因此,我做了一些研究,偶然发现了“ cuda_fp16.h”,它应该在设备上添加许多数学函数。但是,如果我想使用其中的一个数学函数(例如,cos(i)
是该库的一部分),则在编译时会告诉我无法在设备上运行__host__
函数。我很清楚这是不可能的,但是cuda_fp16.h库应该为数学精确添加__device__
函数。在“ cuda_fp16.h”中,有错误提示未定义__half类型。
我查看了正在使用的cos()
的定义,它使我进入了math.h中的内容。所以我的猜测是,它只是从那里获取函数,而不是cuda_fp16.h
#include "cuda.h"
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include "cuda_fp16.h"
__global__ void computation(double x, double y) //function that should upon being called compute the cosine of y.
{
x = cos(y);
}
这是我正在尝试做的一个非常简单的例子;只是为了让内核计算值的某种数学函数。
我希望整个事情都能编译,因为我包括了一个库,该库将允许通过__device__
函数来计算该函数。但是它不能编译,并告诉我不能在设备上调用__host__
函数cos。
答案 0 :(得分:1)
我发现了问题。在代码本身中,我有一个int
而不是double
作为该函数的参数。如果cos()
的参数为int,则它使用函数的<math.h>
版本而不是CUDA版本。使用float
和double
来调用CUDA。因此,我作为示例发布的代码实际上是如何工作的,我只是没有意识到我给出了一个整数作为参数,而不是实际想要的双精度数。