CUDA Внешние звонки не поддерживаются - PullRequest
9 голосов
/ 13 мая 2011

Я занимаюсь разработкой приложения CUDA 4.0, работающего на карте Fermi. Согласно спецификации, Fermi имеет Compute Capability 2.0 и поэтому должен поддерживать вызовы функций без встроенных функций.

Я собираю каждый свой класс с помощью nvcc 4.0 в отдельный файл obj. Затем я связываю их все с g ++ - 4.4.

Рассмотрим следующий код:

[Файл A.cuh]

#include <cuda_runtime.h>

struct A
{
    __device__ __host__ void functionA();
};

[Файл B.cuh]

#include <cuda_runtime.h>

struct B
{
    __device__ __host__ void functionB();
};

[Файл A.cu]

#include "A.cuh"
#include "B.cuh"

void A::functionA()
{
    B b;
    b.functionB();
}

Попытка скомпилировать A.cu с nvcc -o A.o -c A.cu -arch=sm_20 выходами Error: External calls are not supported (found non-inlined call to _ZN1B9functionBEv).

Я должен делать что-то не так, но что?

Ответы [ 3 ]

10 голосов
/ 13 мая 2011

Как объяснено в этой теме на форумах NVidia , похоже, что, хотя Fermi поддерживает не встроенные функции, nvcc по-прежнему необходимо иметь все функции, доступные во время компиляции, то есть в одном исходном файле: компоновщика нет (да, жаль ...).

1 голос
/ 07 апреля 2013

Правда, CUDA 5.0 делает это.Я не могу заставить его выставлять внешние переменные устройства, но методы устройства работают просто отлично. Не по умолчанию.

Параметр nvcc - "-rdc = true".В Visual Studio и Nsight это параметр в свойствах проекта в разделе Свойства конфигурации -> CUDA C / C ++ -> Общие -> Создать код перемещаемого устройства.

1 голос
/ 13 мая 2011

functionB не объявлено и поэтому считается внешним вызовом. По мере ошибки указанные внешние звонки не поддерживаются. Реализуйте functionB, и оно будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...