Как вызвать функцию хоста в ядре CUDA? - PullRequest
13 голосов
/ 30 марта 2012

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

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

Ответы [ 4 ]

27 голосов
/ 30 марта 2012

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

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

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

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

7 голосов
/ 24 сентября 2013

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

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

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

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

5 голосов
/ 02 апреля 2012

Хотя это не относится к '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

0 голосов
/ 10 мая 2016

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

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

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

...