gpt4 book ai didi

c++ - 不支持外部调用 - CUDA

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:45:19 27 4
gpt4 key购买 nike

目标是调用另一个文件中可用的设备函数,当我编译global 内核时它显示以下错误*不支持外部调用(发现对_Z6GoldenSectionCUDA 的非内联调用)*.

有问题的代码(不是完整的代码,而是问题出现的地方),猫规范.h

# ifndef NORM_H_
# define NORM_H_
# include<stdio.h>

__device__ double invcdf(double prob, double mean, double stddev);

#endif

猫规范.cu

# include <norm.h>

__device__ double invcdf(double prob, double mean, double stddev) {
return (mean + stddev*normcdfinv(prob));
}

猫测试.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 manual有关详细信息,但这里是如何让您的示例进行编译。我以 sm_20 为目标,但您可以以 sm_20 或更高版本为目标,具体取决于您拥有的 GPU。在旧设备 (sm_1x) 上无法单独编译。

  • 您不需要在头文件中将 __device__ 函数声明为 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

关于c++ - 不支持外部调用 - CUDA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20884562/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com