Внешние звонки не поддерживаются - CUDA
Цель состоит в том, чтобы вызвать функцию устройства, доступную в другом файле, когда я компилирую глобальное ядро, это показывает следующую ошибку * Внешние вызовы не поддерживаются (обнаружен не встроенный вызов _Z6GoldenSectionCUDA) *.
Проблемный код (не полный код, но там, где возникает проблема), cat norm.h
# 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 "."
1 ответ
Вы пытаетесь выполнить отдельную компиляцию, для которой нужны специальные параметры командной строки. Подробности смотрите в руководстве NVCC, но вот как получить ваш пример для компиляции. Я выбрал sm_20, но вы можете выбрать sm_20 или более позднюю версию в зависимости от того, какой у вас графический процессор. Отдельная компиляция невозможна на старых устройствах (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