目标是调用另一个文件中的设备函数,当我编译全局内核时,它显示以下错误 *不支持外部调用(找到非内联调用_Z6GoldenSectionCUDA )*
有问题的代码(不是完整的代码,但问题出现的地方), cat norm.h
# ifndef NORM_H_
# define NORM_H_
# include<stdio.h>
__device__ double invcdf(double prob, double mean, double stddev);
#endif
cat norm.cu
# include <norm.h>
__device__ double invcdf(double prob, double mean, double stddev) {
return (mean + stddev*normcdfinv(prob));
}
cat test.cu
# include <norm.h>
# include <curand.h>
# include <curand_kernel.h>
__global__ void phase2Kernel(double* out_profit, struct strategyHolder* strategy) {
curandState seedValue;
curand_init(threadIdx.x, 0, 0, &seedValue);
double randomD = invcdf(curand_uniform_double( &seedValue ), 300, 80);
}
nvcc -c norm.cu -o norm.o -I“。”
nvcc -c test.cu -o test.o -I“。”
答案 0 :(得分:5)
您正在尝试单独编译,这需要一些特殊的命令行选项。有关详细信息,请参阅NVCC manual,但这里是如何编译示例的。我的目标是sm_20,但你可以根据你拥有的GPU来定位sm_20或更高版本。旧设备上无法进行单独编译(sm_1x)。
__device__
函数声明为extern
,但如果您有任何静态设备变量,则需要将它们声明为extern
通过编译为设备生成可重定位代码,如下所示(-dc
是设备等效于-c
,有关详细信息,请参阅manual)
nvcc -arch=sm_20 -dc norm.cu -o norm.o -I.
nvcc -arch=sm_20 -dc test.cu -o test.o -I.
在最终主机链接
之前调用nvlink链接代码的设备部分nvlink -arch=sm_20 norm.o test.o -o final.o