2014-01-02 3 views
4

Цель заключается в вызове функции устройства доступны в другом файле, когда я скомпилировать глобальные ядра он показывает следующее сообщение об ошибке * Внешние вызовы не поддерживаются (нашли, не встраиваются вызов _Z6GoldenSectionCUDA) *.Внешние вызовы не поддерживаются - CUDA

Проблемный код (не полный код, но здесь возникает проблема), кошка 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 "."

+2

Пожалуйста, пост примера, чтобы воспроизвести проблему (см [здесь] (http://sscce.org) для руководства), ваш код работает для меня , – Tom

+2

В реальном коде (в отличие от того, что вы здесь показали), вы явно вызываете конструктор или полагаетесь на конструктор по умолчанию класса? – talonmies

+1

Не могли бы вы указать аргументы nvcc, которые вы используете? – geek

ответ

5

Вы пытаетесь выполнить отдельную компиляцию, которая требует некоторых специальных параметров командной строки. Подробнее см. В разделе NVCC manual, но вот как получить пример для компиляции. Я нацелил sm_20, но вы можете настроить таргетинг sm_20 или более поздней версии в зависимости от того, какой у вас GPU. Отдельная компиляция невозможна на более старых устройствах (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 
    
+0

Нужно ли объявлять функцию '__device__' как' extern'? Я компилирую вышеуказанный код с опцией '-rdc = true' без' extern'. Может быть, чего-то я не вижу? – JackOLantern

+0

@Tom extern на самом деле не нужен, я думаю. Он прекрасно компилируется с указаниями, указанными в ссылке, которую вы предоставили. – Itachi

+2

«extern» определенно требуется для статически определенных символов, чтобы предотвратить ошибки дублирования при связывании, но для функции должно быть достаточно декларации в начале. – talonmies

Смежные вопросы