不支持外部调用 - CUDA
External calls are not supported - CUDA
目标是调用另一个文件中可用的设备函数,当我编译全局内核时,它显示以下错误*不支持外部调用(发现对_Z6GoldenSectionCUDA的非内联调用)*。
有问题的代码(不是完整的代码,而是出现问题的地方),猫咪诺姆·
# ifndef NORM_H_
# define NORM_H_
# include<stdio.h>
__device__ double invcdf(double prob, double mean, double stddev);
#endif
猫 norm.cu
# include <norm.h>
__device__ double invcdf(double prob, double mean, double stddev) {
return (mean + stddev*normcdfinv(prob));
}
猫 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"。
您正在尝试进行单独的编译,这需要一些特殊的命令行选项。有关详细信息,请参阅 NVCC 手册,但以下是编译示例的方法。我已经定位了sm_20,但您可以定位sm_20或更晚,具体取决于您拥有的 GPU。在较旧的设备上无法单独编译 (sm_1x)。
- 无需在头文件中将
__device__
函数声明为extern
,但如果有任何静态设备变量,则需要将它们声明为extern
-
通过如下图编译为设备生成可重定位代码(
-dc
是设备等效于-c
,更多信息见手册)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
相关文章:
- 如何使用对C函数和类对象的外部调用来处理C++头文件
- 在结构外部调用指向函数的指针
- 编译为 cuda 内核调用提供了"expression must have integral or unscoped enum type"
- 从类C++外部调用指向成员方法的成员指针
- cuda 内核调用/传递参数中的编译错误
- 使用什么,外部调用或 COM 或其他
- 从外部调用静态C函数
- 如何调试外部调用的C++可执行文件
- 不支持外部调用 - CUDA
- C++:如何从外部调用父类函数
- CUDA - 内核调用中的编译错误
- 从 Cuda 内核调用函子
- 来自C++的未解析的外部调用 C 函数
- 我可以从对象外部调用 VFunc 吗?
- 如果由另一个 OpenMP 程序调用,则外部调用的 OpenMP 程序仅使用一个线程运行
- 状态:从CUDA库调用cusolverDdgeqrf时执行失败
- 从外部调用封装类成员函数时不加载SFML纹理
- 向外部调用程序返回一个值
- CUDA c++:使用调用模板内核的模板函数
- CUDA内核调用中的隐式构造函数