2012-03-30 2 views
12

Как следует из следующей ошибки, вызов функции хоста ('rand') не допускается в ядре, и я задаюсь вопросом, есть ли решение для него, если мне это нужно.Как вызвать функцию хоста в ядре CUDA?

error: calling a host function("rand") from a __device__/__global__ function("xS_v1_cuda") is not allowed 

ответ

26

К сожалению, вы не можете вызывать функции на устройстве, которые не указаны с помощью модификатора __device__. Если вам нужно в случайных чисел в коде устройства смотрят на Cuda генератор случайных curandhttp://developer.nvidia.com/curand

Если у вас есть собственные функции хоста, которому вы хотите позвонить из использования ядра оба __host__ и __device__ модификаторы на нем:

__host__ __device__ int add(int a, int b) 
{ 
    return a + b; 
} 

Когда этот файл скомпилирован драйвером компилятора NVCC, скомпилированы две версии функций: один вызываемый по коду хоста, а другой - код устройства. И именно поэтому эту функцию теперь можно назвать как хостом, так и кодом устройства.

+1

Насколько плохо ухудшается производительность при вызове функции хоста вместо использования встроенного cuda? – Mattia

+0

Означает ли это, что хост и устройство будут выполнять только свои собственные копии функций? – avgvstvs

5

Хотя не относится к «RAND()», но несколько функций хозяевах типа «Printf» доступны при компиляции с совместимостью вычислительном> = 2,0

например:

nvcc.exe -gencode=arch=compute_10,code=\sm_10,compute_10\... 
error : calling a host function("printf") from a __device__/__global__ function("myKernel") is not allowed 

Собирает и работает с sm_20 , compute_20

7

Короткий ответ заключается в том, что здесь нет решения этой проблемы.

Все, что обычно работает на процессоре, должно быть адаптировано для среды CUDA без каких-либо гарантий, что это возможно. Функции хоста - это просто другое имя в CUDA для обычных функций C. То есть, функции, выполняемые на архитектуре центрального процессора Von Neumann, как и все C/C++, до сих пор были на ПК. Графические процессоры дают вам огромное количество вычислительной мощности, но стоимость в том, что она не так гибка или совместима. Самое главное, что функции работают без возможности доступа к основной памяти, а доступная им память ограничена.

Если вы пытаетесь получить генератор случайных чисел, вам повезло, учитывая, что Nvidia столкнулась с проблемой специально внедрить высокоэффективный Mersenne Twister, который может поддерживать до 256 потоков на SMP. Он может быть вызван внутри функции устройства, описанной в более раннем сообщении шахты here. Если кто-нибудь найдет лучшую ссылку, описывающую эту функциональность, удалите мою и замените соответствующий текст здесь вместе со ссылкой.

Одна вещь, которую я постоянно удивляю, заключается в том, сколько программистов, похоже, не знают, как стандартизованные генераторы псевдослучайных чисел высокого качества. «Роллинг свой» - это действительно не очень хорошая идея, учитывая, сколько из произведений искусства псевдослучайных чисел. Проверка генератора в качестве обеспечения благоугодно непредсказуемых номеров занимает много работы и научных талантов ...

-1

Я не согласен с некоторыми из других ответов в следующем смысле:

OP не описывает проблему : не прискорбно, что вы не можете вызвать __host__ функции из кода устройства - это совершенно невозможно, если бы это было иначе, и это неплохо.

Чтобы объяснить: подумайте о коде хоста (ЦП), таком как CD, который вы положили в CD-плеер; и на коде устройства, например, на SD-карте, которую вы положили в миниатюрный музыкальный плеер.Вопрос OP: «Как я могу засунуть диск в мой миниатюрный музыкальный плеер»? Вы не можете, и это не имеет смысла хотеть. Это может быть одна и та же музыка (код с одинаковой функциональностью, хотя обычно код хоста и код устройства не выполняют совершенно ту же вычислительную задачу), но носители не являются взаимозаменяемыми.

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